Mogę uzyskać wszystkie elementy podrzędne rekurencyjnie za pomocą tego polecenia:
Get-ChildItem -recurse
Ale czy istnieje sposób na ograniczenie głębokości? Czy chcę na przykład powtórzyć tylko jeden lub dwa poziomy w dół?
powershell
Svish
źródło
źródło
Get-ChildItem .\*\*\*,.\*\*,.\*
W pewnym momencie w programie PowerShell 5,1 Get-ChildItem ma teraz-Depth
parametr.Począwszy od programu PowerShell 5.0 , możesz teraz używać
-Depth
parametru wGet-ChildItem
!Łączysz to z,
-Recurse
aby ograniczyć rekursję.Get-ChildItem -Recurse -Depth 2
źródło
-Recurse
przełącznik jest opcjonalny / domniemany, gdy-Depth
jest określony.-Exclude
gdy dołączona do-Depth
neguje-Depth
wartość.gci c:\*.exe -Depth 1
zwraca pliki głęboko w wielu podkatalogach.gci c:\ -filter *.exe -depth 1
prawdopodobnie dostaniesz to, czego chcesz @GuitarPicker Nie mam teraz komputera z systemem Windows do przetestowaniaWypróbuj tę funkcję:
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)") } } } }
źródło
źródło
Get-ChildItemToDepth -ToDepth 2
(praca nad bieżącym katalogiem)Próbowałem ograniczyć głębokość rekursji Get-ChildItem za pomocą Resolve-Path
$PATH = "." $folder = get-item $PATH $FolderFullName = $Folder.FullName $PATHs = Resolve-Path $FolderFullName\*\*\*\ $Folders = $PATHs | get-item | where {$_.PsIsContainer}
Ale to działa dobrze:
gci "$PATH\*\*\*\*"
źródło
Jest to funkcja, która generuje jeden wiersz na element, z wcięciem zależnym od poziomu głębokości. Prawdopodobnie jest znacznie bardziej czytelny.
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 } } } }
Opiera się na poście na blogu, Praktyczny program PowerShell: czyszczenie drzew plików i rozszerzanie poleceń cmdlet .
źródło
@scanlegentil Podoba mi się to.
Mała poprawa byłaby:
$Depth = 2 $Path = "." $Levels = "\*" * $Depth $Folder = Get-Item $Path $FolderFullName = $Folder.FullName Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host
Jak wspomniano, skanowałoby to tylko określoną głębokość, więc ta modyfikacja jest ulepszeniem:
$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 }
źródło