Comment filtrer correctement plusieurs chaînes dans un script de copie de PowerShell

j'utilise le script PowerShell de cette réponse pour faire une copie de fichier. Le problème se pose quand je veux inclure plusieurs types de fichiers en utilisant le filtre.

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

fonctionne comme un rêve. Cependant, le problème se pose quand je veux inclure plusieurs types de fichiers en utilisant le filtre.

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 donne l'erreur suivante:

Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported.
At F:datafooCGM.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

j'ai plusieurs itérations de parenthèses, pas de parenthèses, -filter , -include , définissant les inclusions comme variable (par exemple, $fileFilter ) et à chaque fois obtenir l'erreur ci-dessus, et toujours pointant vers ce qui suit -filter .

l'exception intéressante est quand je code -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*" . Il n'y a pas d'erreurs, mais je n'obtiens aucun résultat et rien sur la console. Je soupçonne que j'ai par inadvertance codé un impicit and avec cette déclaration?

de Sorte que je suis Je me trompe, et comment puis-je le corriger?

61
demandé sur Community 2013-09-04 18:29:29

4 réponses

- filtre n'accepte qu'une seule chaîne. - Include accepte plusieurs valeurs, mais qualifie l'argument - Path . L'astuce consiste à ajouter \* à la fin du chemin, puis utiliser -inclure pour sélectionner plusieurs extensions. BTW, citer des chaînes n'est pas nécessaire dans les arguments cmdlet à moins qu'elles ne contiennent des espaces ou des caractères spéciaux.

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

Note que cela fonctionne indépendamment du fait que $originalPath se termine par un antislash, car plusieurs antislashs consécutifs sont interprétés comme un séparateur de chemin unique. Par exemple, essayez:

Get-ChildItem C:\\\Windows
131
répondu Adi Inbar 2013-09-05 01:44:49

quelque chose comme ceci devrait fonctionner (il a fait pour moi). La raison de vouloir utiliser -Filter au lieu de -Include est que include prend un énorme succès de performance par rapport à -Filter .

ci-dessous boucle juste chaque type de fichier et plusieurs serveurs/postes de travail spécifiés dans des fichiers séparés.

##  
##  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
1
répondu Kevin 2018-04-21 14:53:41
-2
répondu capsch 2013-09-04 14:46:15
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")
-2
répondu DPC 2014-06-13 17:54:19