Powershell

Get-Childitem bis zu bestimmter Verzeichnistiefe

Hi Leute,

heute kam ich in die Verlegenheit nach bestimmten Dateien vom Typ *.xyz zu suchen.

Die Dateien liegen alle in Unterordnern eines Wurzelverzeichnisses, z.B. so:

  • C:\Hauptverzeichnis\Verzeichnis1\irgendeinname.xyz
  • C:\Hauptverzeichnis\Verzeichnis2\einanderername.xyz
  • C:\Hauptverzeichnis\Ordnername\dateiname.xyz

In Powershell 5 hat das Cmdlet Get-ChildItem einen Parameter -Depth mit dem die Suchtiefe angegeben werden kann. Da mir nur Powershell 4 zur Verfügung steht kann ich den Parameter -Depth von Get-ChildItem noch nicht nutzen.

Natürlich kann ich in Powershell per

Get-ChildItem C:\Hauptverzeichnis -Recurse

alle Unterordner durchsuchen, da es sich aber um eine sehr tiefe Verzeichnisstruktur mit abertausenden Unterordnern und Dateien handelt wollte ich mir diesen Aufwand – und die Skriptlaufzeit – sparen.

Nun kann ich folgendes machen

Get-ChildItem C:\Hauptverzeichnis\*\*.sms

Damit suche ich in jedem Ordner unterhalb von C:\Hauptverzeichnis (\*) und darin jede Datei mit der Endung sms (\*.sms).

Da das ganze bei einer tieferen Suchebene schnell unübersichtlich wird (C:\Hauptverzeichnis\*\*\*\*\*.sms), habe ich das ganze in eine Funktion verpackt. Dieser Funktion könnt Ihr als Parameter den Pfad des Hauptverzeichnisses, einen Filter und die gewünschte Suchtiefe übergeben:

Function Get-ChildItemToDepth {
    Param(
        [String]$Path = $PWD,
        [String]$Filter = "*",
        [Byte]$ToDepth = 2,
        [Byte]$CurrentDepth = 0
    )

    $CurrentDepth++

    Get-ChildItem $Path | %{
        $_ | ?{ $_.Name -Like $Filter }

        If ($_.PsIsContainer) {
            If ($CurrentDepth -le $ToDepth) {
                Get-ChildItemToDepth -Path $_.FullName -Filter $Filter `
                  -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
            Else {
                Write-Debug $("Skip Folder: $($_.FullName) " + `
                  "(Cause: Current depth $CurrentDepth exceeds limit depth $ToDepth)")
            }
        }
    }
}

Der Aufruf für eine Suchtiefe von 4 Verzeichnissen würde also wie folgt lauten:

Get-ChildItemToDepth C:\Hauptverzeichnis -Filter *.sms -ToDepth 4

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.