Come filtrare correttamente più stringhe in uno script di copia PowerShell

Sto usando lo script PowerShell da questa risposta per fare una copia di file. Il problema sorge quando voglio includere più tipi di file usando il 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 } 

funziona come un sogno. Tuttavia, il problema sorge quando voglio includere più tipi di file usando il 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 } 

Mi dà il seguente errore:

 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 

Ho varie iterazioni di parentesi, nessuna parentesi, -filter , inclusione, definizione delle inclusioni come variabile (ad esempio $fileFilter ) e ogni volta ottengo l’errore sopra riportato, e sempre puntando a ciò che segue -filter .

L’interessante eccezione è che io -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*" codice -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*" . Non ci sono errori, ma io e non ottengo risultati e niente torna alla console. Sospetto di aver inavvertitamente codificato un impeccio and con questa affermazione?

Quindi cosa sto sbagliando e come posso correggerlo?

-Filter accetta solo una singola stringa. -Include accetta più valori, ma qualifica l’argomento -Path . Il trucco è di aggiungere \* alla fine del percorso e quindi utilizzare -Include per selezionare più estensioni. BTW, la citazione delle stringhe non è necessaria negli argomenti del cmdlet a meno che non contengano spazi o caratteri speciali della shell.

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

Si noti che ciò funzionerà indipendentemente dal fatto che $ OriginalPath termini in una barra rovesciata, poiché più backslash consecutivi vengono interpretati come un separatore di percorso singolo. Ad esempio, prova:

 Get-ChildItem C:\\\\\Windows 

Qualcosa del genere dovrebbe funzionare (lo ha fatto per me). Il motivo per cui vuoi usare -Filter invece di -Include è che l’inclusione comporta un enorme -Include prestazioni rispetto a -Filter .

Di seguito vengono riportati solo i singoli tipi di file e più server / workstation specificati in file separati.

 ## ## 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")