Ich versuche, den folgenden Code als Powershell-Skript auszuführen, aber ich bekomme ihn nicht zum Laufen. Erstens funktioniert das Folgende mit einem -Include
Element, aber ich scheine es nicht mit mehreren zum Laufen zu bringen. Zweitens -Exclude
scheint der Perimeter nicht zu funktionieren. Ich bekomme immer noch Dateien vonC:\WindowsUndC:\ProgrammeVerzeichnisse .
$Include = "*.zip","*.rar","*.tar","*.7zip"
$exclude = "C:\Windows","C:\Program Files"
Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName
Hinweis: Der Zweck dieses Skripts besteht darin, alle komprimierten Dateien auf dem System zu finden. Ich weiß, dass das wahrscheinlich ganz einfach ist, aber ich kriege es einfach nicht zum Laufen.
Antwort1
Der -Exclude
Parameter hat nie richtig funktioniert. Er scheint auf die Name
Eigenschaft zu passen, was normalerweise nicht sehr nützlich ist. Wahrscheinlich müssen Sie die Filterung einfach selbst vornehmen:
$Include = "*.zip","*.rar","*.tar","*.7zip"
Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue |
? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } |
Select-Object -ExpandProperty FullName
(Übrigens -Filter
ist viel, viel schneller als -Include
. Der Nachteil besteht darin, dass Sie ihm kein Array von Mustern zuweisen können, wie dies bei möglich ist -Include
. Aber es kann trotzdem schneller sein, selbst wenn Sie viermal suchen müssten. Ich kann es nicht mit Sicherheit sagen. Wenn Ihnen Geschwindigkeit wichtig ist, ist es möglicherweise einen Test wert.)
Antwort2
Ich stimme mit dangph überein, dass -exclude nicht wie erwartet funktioniert.
Wenn Sie -notmatch verwenden, können Sie ein Regex-Muster mit einem oder erstellen |
.
Dies funktioniert hier mit dem überarbeiteten $include:
$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0|
Where FullName -notmatch $exclude|
Select-Object -ExpandProperty FullName
BearbeitenDa sich die ausgeschlossenen Ordner auf der ersten Ebene befinden, ist es viel schneller, sie überhaupt nicht zu iterieren. Daher ist ein zweistufiger Ansatz effizienter:
$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Directory |
Where FullName -notmatch $exclude|ForEach {
Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0|
Select-Object -ExpandProperty FullName
}