Как правильно фильтровать несколько строк в сценарии копирования PowerShell
Я использую сценарий PowerShell из этого ответа, чтобы сделать копию файла. Проблема возникает, когда я хочу включить несколько типов файлов с помощью фильтра.
Get-ChildItem $originalPath -filter "*.htm" | `
foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); `
New-Item -ItemType File -Path $targetFile -Force; `
Copy-Item $_.FullName -destination $targetFile }
работает как сон. Однако проблема возникает, когда я хочу включить несколько типов файлов с помощью фильтра.
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 }
дает мне следующую ошибку:
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
у меня есть различные итерации скобок, никаких скобок,-filter,-include, определив стоимость переменная (например, $fileFilter) и каждый раз получить выше ошибку, и всегда указывая на то, что следует -filter.
интересное исключение из этого-когда я кодирую -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*". Ошибок нет, но я и не получаю никаких результатов и ничего в консоль. Я подозреваю, что я случайно закодировал impicit and С этим утверждением?
так что же я делаю не так, и как я могу это исправить?
4 ответов:
фильтр принимает только одну строку. -добавить принимает несколько значений, но квалифицируется -путь
что-то вроде этого должно работать (это сделали за меня). Причина для желающих использовать
-Filterвместо-IncludeЭто включает в себя огромный хит производительности по сравнению с-Filter.ниже просто петли каждый тип файла и несколько серверов/рабочих станций, указанных в отдельных файлах.
## ## 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
использовать include-это самый простой способ в соответствии с
http://www.vistax64.com/powershell/168315-get-childitem-filter-files-multiple-extensions.html
Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")
Comments