it-swarm.com.de

Begrenzen Sie die Rekursionstiefe für Get-ChildItem

Ich kann alle Unterelemente mit diesem Befehl rekursiv abrufen:

Get-ChildItem -recurse

Aber gibt es eine Möglichkeit, die Tiefe zu begrenzen? Wenn ich zum Beispiel nur ein oder zwei Stufen nach unten rekursieren möchte?

63
Svish

Du kannst es versuchen:

Get-ChildItem \*\*\*

Dies gibt alle Elemente mit einer Tiefe von zwei Unterordnern zurück. Durch das Hinzufügen von\* wird ein zusätzlicher Unterordner hinzugefügt, in dem gesucht werden soll.

Um die rekursive Suche mit get-childitem einzuschränken, müssen Sie entsprechend der OP-Frage alle Tiefen angeben, die durchsucht werden können.

Get-ChildItem \*\*\*,\*\*,\*

Gibt die Kinder in jeder Tiefe 2,1 und 0 zurück

92
CB.

Ab Powershell 5.0 können Sie jetzt den -Depth-Parameter in Get-ChildItem verwenden!

Sie kombinieren es mit -Recurse, um die Rekursion zu begrenzen.

Get-ChildItem -Recurse -Depth 2
43
dee-see

Versuchen Sie diese Funktion:

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

    $CurrentDepth++
    If ($DebugMode) {
        $DebugPreference = "Continue"
    }

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

        If ($_.PsIsContainer) {
            If ($CurrentDepth -le $ToDepth) {

                # Callback to this function
                Get-ChildItemToDepth -Path $_.FullName -Filter $Filter `
                  -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
            Else {
                Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
                  "(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
            }
        }
    }
}

Quelle

8
walid2mi

Dies ist eine Funktion, die eine Zeile pro Element ausgibt, wobei der Tiefenwert entsprechend eingerückt wird. Es ist wahrscheinlich viel lesbarer.

function GetDirs($path = $pwd, [Byte]$ToDepth = 255, [Byte]$CurrentDepth = 0)
{
    $CurrentDepth++
    If ($CurrentDepth -le $ToDepth) {
        foreach ($item in Get-ChildItem $path)
        {
            if (Test-Path $item.FullName -PathType Container)
            {
                "." * $CurrentDepth + $item.FullName
                GetDirs $item.FullName -ToDepth $ToDepth -CurrentDepth $CurrentDepth
            }
        }
    }
}

Es basiert auf einem Blogbeitrag, Practical PowerShell: Dateibäume beschneiden und Cmdlets erweitern.

1
sancho.s

Ich habe versucht, die Rekursionstiefe von Get-ChildItem mithilfe von Resolve-Path zu begrenzen

$PATH = "."
$folder = get-item $PATH 
$FolderFullName = $Folder.FullName
$PATHs = Resolve-Path $FolderFullName\*\*\*\
$Folders = $PATHs | get-item | where {$_.PsIsContainer}

Das funktioniert aber gut:

gci "$PATH\*\*\*\*"
1
scanlegentil

@scanlegentil Ich mag das.
Eine kleine Verbesserung wäre:

$Depth = 2
$Path = "."

$Levels = "\*" * $Depth
$Folder = Get-Item $Path
$FolderFullName = $Folder.FullName
Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host

Wie bereits erwähnt, würde dies nur die angegebene Tiefe scannen, sodass diese Änderung eine Verbesserung darstellt:

$StartLevel = 1 # 0 = include base folder, 1 = sub-folders only, 2 = start at 2nd level
$Depth = 2      # How many levels deep to scan
$Path = "."     # starting path

For ($i=$StartLevel; $i -le $Depth; $i++) {
    $Levels = "\*" * $i
    (Resolve-Path $Path$Levels).ProviderPath | Get-Item | Where PsIsContainer |
    Select FullName
}
0
kevro