Cómo filtrar correctamente varias cadenas en una secuencia de comandos de copia de PowerShell

Estoy usando el script de PowerShell de esta respuesta para hacer una copia de archivo. El problema surge cuando quiero incluir varios tipos de archivos usando el filtro.

Get-ChildItem $originalPath -filter "*.htm" | ` foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` New-Item -ItemType File -Path $targetFile -Force; ` Copy-Item $_.FullName -destination $targetFile } 

funciona como un sueño Sin embargo, el problema surge cuando quiero incluir múltiples tipos de archivos usando el filtro.

 Get-ChildItem $originalPath ` -filter "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*") | ` foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` New-Item -ItemType File -Path $targetFile -Force; ` Copy-Item $_.FullName -destination $targetFile } 

Me da el siguiente error:

 Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported. At F:\data\foo\CGM.ps1:121 char:36 + Get-ChildItem $originalPath -filter <<<< "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*" | ` + CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.GetChildItemCommand 

Tengo varias iteraciones entre paréntesis, sin paréntesis, -include , -include , definiendo las inclusiones como variable (por ejemplo, $fileFilter ) y cada vez obtengo el error anterior, y siempre apuntando a lo que sigue -filter .

La excepción interesante es cuando codigo -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*" . No hay errores, pero no obtengo resultados ni devuelvo nada a la consola. Sospecho que inadvertidamente he codificado un implicit and con esa statement?

Entonces, ¿qué estoy haciendo mal y cómo puedo corregirlo?

-Filter solo acepta una sola cadena. -Include acepta valores múltiples, pero califica el argumento -Path . El truco está en agregar \* al final de la ruta y luego utilizar -Incluir para seleccionar múltiples extensiones. Por cierto, no es necesario citar cadenas en los argumentos de cmdlet a menos que contengan espacios o caracteres especiales de shell.

 Get-ChildItem $originalPath\* -Include *.gif, *.jpg, *.xls*, *.doc*, *.pdf*, *.wav*, .ppt* 

Tenga en cuenta que esto funcionará independientemente de si $ originalPath termina en una barra diagonal inversa, ya que varias barras inversas consecutivas se interpretan como un único separador de ruta. Por ejemplo, intente:

 Get-ChildItem C:\\\\\Windows 

Algo como esto debería funcionar (lo hizo por mí). El motivo por el que se quiere utilizar -Filter lugar de -Include es que incluir toma un gran golpe de rendimiento en comparación con -Filter .

A continuación, simplemente realiza un bucle de cada tipo de archivo y varios servidores / estaciones de trabajo especificados en archivos separados.

 ## ## This script will pull from a list of workstations in a text file and search for the specified string ## Change the file path below to where your list of target workstations reside ## Change the file path below to where your list of filetypes reside $filetypes = gc 'pathToListOffiletypes.txt' $servers = gc 'pathToListOfWorkstations.txt' ##Set the scope of the variable so it has visibility set-variable -Name searchString -Scope 0 $searchString = 'whatYouAreSearchingFor' foreach ($server in $servers) { foreach ($filetype in $filetypes) { ## below creates the search path. This could be further improved to exclude the windows directory $serverString = "\\"+$server+"\c$\Program Files" ## Display the server being queried write-host “Server:” $server "searching for " $filetype in $serverString Get-ChildItem -Path $serverString -Recurse -Filter $filetype | #-Include "*.xml","*.ps1","*.cnf","*.odf","*.conf","*.bat","*.cfg","*.ini","*.config","*.info","*.nfo","*.txt" | Select-String -pattern $searchstring | group path | select name | out-file f:\DataCentre\String_Results.txt $os = gwmi win32_operatingsystem -computer $server $sp = $os | % {$_.servicepackmajorversion} $a = $os | % {$_.caption} ## Below will list again the server name as well as its OS and SP ## Because the script may not be monitored, this helps confirm the machine has been successfully scanned write-host $server “has completed its " $filetype "scan:” “|” “OS:” $a “SP:” “|” $sp } } #end script 
 Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt") 
    Intereting Posts