PowerShell Get-ChildItem Include \ Exclude - Ein einfaches Skript funktioniert nicht richtig

2062
securityghost

Ich versuche den folgenden Code als Powershell-Skript auszuführen, aber ich kann ihn nicht zum Laufen bringen. Erstens funktioniert das Folgende mit einem -IncludeArtikel, aber ich scheine es nicht mit mehreren zu erreichen. -ExcludeZweitens scheint der Umfang nicht zu funktionieren. Ich bekomme immer noch Dateien aus den Verzeichnissen C: \ Windows und C: \ Program Files .

$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: Dieses Skript dient dazu, alle komprimierten Dateien im System zu finden. Ich weiß, dass dies wahrscheinlich sehr einfach ist, aber ich kann es einfach nicht schaffen, dass es funktioniert.

3

2 Antworten auf die Frage

2
LotPings

Ich stimme mit dangph überein, dass der -exclude nicht wie erwartet funktioniert.
Wenn Sie -notmatch verwenden, können Sie ein Regex-Muster mit oder erstellen |.
Das 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 

EDIT Da es sich bei den ausgeschlossenen Ordnern um die erste Ebene handelt, ist es viel schneller, sie nicht zu durchlaufen. 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 } 
Sobald ich die "-Force" und die "-EA 0" herausgenommen habe, hat es funktioniert. Ich weiß nicht warum? Vielen Dank. securityghost vor 7 Jahren 0
Entschuldigung, Unterschiede in der PowerShell-Version. Beide werden in höheren Releases unterstützt. "-EA 0" ist nur eine Abkürzung für "-ErrorAction Silentcontinue" LotPings vor 7 Jahren 0
1
dangph

Der -ExcludeParameter hat noch nie richtig funktioniert. Es scheint auf das NameGrundstück zu passen, was normalerweise nicht sehr nützlich ist. Sie müssen wahrscheinlich nur die Filterung selbst durchführen:

$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, -Filterist viel, viel schneller als -Include. Der Nachteil ist, dass Sie ihm keine Reihe von Mustern geben können, wie Sie es können -Include. Aber es kann trotzdem schneller sein, auch wenn Sie viermal suchen mussten. Ich konnte es nicht sicher sagen. Vielleicht lohnt es sich zu testen, ob Geschwindigkeit für Sie wichtig ist.)