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?
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
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
utiliser l'inclure est la manière la plus facile selon
http://www.vistax64.com/powershell/168315-get-childitem-filter-files-multiple-extensions.html
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")