Mit diesem Befehl kann ich alle Unterelemente rekursiv abrufen:
Get-ChildItem -recurse
Aber gibt es eine Möglichkeit, die Tiefe zu begrenzen? Wenn ich zum Beispiel nur ein oder zwei Ebenen nach unten rekursieren möchte?
powershell
Svish
quelle
quelle
Get-ChildItem .\*\*\*,.\*\*,.\*
In PowerShell 5.1 verfügt Get-ChildItem irgendwann über einen-Depth
Parameter.Ab Powershell 5.0 können Sie jetzt den
-Depth
Parameter inGet-ChildItem
!Sie kombinieren es mit
-Recurse
, um die Rekursion zu begrenzen.quelle
-Recurse
Schalter optional / impliziert ist, wenn er-Depth
angegeben wird.-Exclude
wenn sie-Depth
den-Depth
Wert negiert .gci c:\*.exe -Depth 1
Dateien mit mehreren Unterverzeichnissen zurück.gci c:\ -filter *.exe -depth 1
würde dir wahrscheinlich das bringen, was du willst @GuitarPicker Ich habe momentan jedoch keine Windows-Maschine zum TestenVersuchen 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
quelle
Get-ChildItemToDepth -ToDepth 2
(arbeitet am aktuellen Verzeichnis)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}
Aber das funktioniert gut:
gci "$PATH\*\*\*\*"
quelle
Dies ist eine Funktion, die eine Zeile pro Element mit Einrückung entsprechend der Tiefenstufe ausgibt. Es ist wahrscheinlich viel besser lesbar.
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: Bereinigen von Dateibäumen und Erweitern von Cmdlets .
quelle
@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, daher ist diese Änderung eine Verbesserung:
$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 }
quelle