Ich verwende das PowerShell-Skript aus dieser Antwort , um eine Dateikopie zu erstellen. Das Problem tritt auf, wenn ich mithilfe des Filters mehrere Dateitypen einschließen möchte.
Get-ChildItem $originalPath -filter "*.htm" | `
foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); `
New-Item -ItemType File -Path $targetFile -Force; `
Copy-Item $_.FullName -destination $targetFile }
funktioniert wie ein Traum. Das Problem tritt jedoch auf, wenn ich mithilfe des Filters mehrere Dateitypen einschließen möchte.
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 }
Gibt mir folgenden Fehler:
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
Ich habe verschiedene Iterationen von Klammern, keine Klammern -filter
, -include
und definiert die Einschlüsse als Variable (zB $fileFilter
) und jedes Mal den obigen Fehler erhalten, und immer zeigt auf was auch immer folgt -filter
.
Die interessante Ausnahme ist, wenn ich codiere -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*"
. Es gibt keine Fehler, aber ich bekomme keine Ergebnisse und nichts zurück zur Konsole. Ich vermute, ich habe versehentlich einen Impicit and
mit dieser Aussage codiert ?
Was mache ich also falsch und wie kann ich das korrigieren?
quelle
\*
Trick hat gerade sechs Probleme gelöst. Super & Danke!\*
) nicht benötigt wird, wenn er-Recurse
angegeben wird.So etwas sollte funktionieren (es hat für mich funktioniert). Der Grund für die Verwendung
-Filter
anstelle von-Include
ist, dass include im Vergleich zu einen enormen Leistungseinbruch bedeutet-Filter
.Im Folgenden werden nur die einzelnen Dateitypen und mehrere Server / Arbeitsstationen in separaten Dateien wiederholt.
## ## 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
quelle
-filter *.jpg, *.png
können, immer noch schneller sein könnte, -filter * .jpg auf einmal zu tun, als -filter * .png zu tun und sich den Ergebnissen anzuschließen, als mach eins-Include *.jpg, *.png"
. Ich habe einen Ordner mit 126.000 Dateien und 18.000 Ordnern. Ich suche rekursiv nach einer Datei und einem Ordner in jedem Ordner. Die Verwendung von -Filter dauert 5 Sekunden und die Verwendung von -Include 30 Sekunden. Zweimaliges Filtern in 10 Sekunden ist dreimal schneller als einmaliges Einschließen.Get-ChildItem $originalPath\* -Include @("*.gif", "*.jpg", "*.xls*", "*.doc*", "*.pdf*", "*.wav*", "*.ppt")
quelle
@()
) enthält, was überflüssig ist, da eine durch Kommas getrennte Liste von Natur aus als Array ausgewertet wird.Verwenden Sie das Include ist der einfachste Weg gemäß
http://www.vistax64.com/powershell/168315-get-childitem-filter-files-multiple-extensions.html
quelle
-filter -include *.file, *.types
-filter -include (*.file, *.types)
,-filter -include "*.file", "*.types"
und-filter -include ("*.file", "*.types")
alle wie oben pro meine Frage errored aus der Beseitigung.-filter
Parameter und nur einschließlich der-include
(gleichen Iterationen von Zitaten und Pars) hat nicht zur Folge haben Laufzeitfehler, aber es war im Zielverzeichnis keine Ergebnismenge.