Powershell Get-ChildItem Include\Exclude - einfaches Skript funktioniert nicht richtig

Powershell Get-ChildItem Include\Exclude - einfaches Skript funktioniert nicht richtig

Ich versuche, den folgenden Code als Powershell-Skript auszuführen, aber ich bekomme ihn nicht zum Laufen. Erstens funktioniert das Folgende mit einem -IncludeElement, aber ich scheine es nicht mit mehreren zum Laufen zu bringen. Zweitens -Excludescheint 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 -ExcludeParameter hat nie richtig funktioniert. Er scheint auf die NameEigenschaft 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 -Filterist 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
}

verwandte Informationen