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
utilizar el include es la forma más fácil según
http://www.vistax64.com/powershell/168315-get-childitem-filter-files-multiple-extensions.html
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")