Get-ChildItem yineleme derinliğini sınırla


82

Bu komutu kullanarak tüm alt öğeleri yinelemeli olarak alabilirim:

Get-ChildItem -recurse

Ama derinliği sınırlamanın bir yolu var mı? Örneğin, sadece bir veya iki seviye aşağı tekrarlamak istersem?

Yanıtlar:


109

Derinliği 2 ile sınırlamak için bunu kullanın:

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

Çalışma şekli, çocukları 2,1 ve 0 derinliklerinde döndürmesidir.


Açıklama:

Bu komut

Get-ChildItem \*\*\*

derinliği iki alt klasör olan tüm öğeleri döndürür. \ * Eklemek, arama yapılacak ek bir alt klasör ekler.

OP sorusu doğrultusunda, get-childitem kullanarak yinelemeli aramayı sınırlamak için aranabilecek tüm derinlikleri belirtmeniz gerekir.


Çok harika. Sanırım bunu PowerShell'de yapmam gerekmedi, ancak daha önce CMD.EXE'de bunu dilediğimi biliyorum.
— aphoria

15
Orta derinlikleri çekmek için "-yol \ * \ * \ *, \ * \ *, \ *" yapmanız gerekiyor gibi görünüyor.
— Gerard ONeill

Denedim, yine de aşağı yerine yukarı çıkıyor gibi görünüyor. Superuser.com/questions/258287/… 'de olduğu gibi bir Klasör Ağacı oluşturmayı nasıl kullanabilirim ? Teşekkür ederim.
— Royi

2
Özyinelemeyi mevcut dizinden başlatmak için, her yolun başına bir nokta eklenmelidir. Get-ChildItem .\*\*\*,.\*\*,.\*Bir noktada, PowerShell 5.1 tarafından Get-ChildItem artık bir -Depthparametreye sahiptir.
— yaktı

65

Powershell 5.0'dan itibaren , artık -Depthparametreyi içinde kullanabilirsiniz Get-ChildItem!

-RecurseÖzyinelemeyi sınırlamak için onu ile birleştirirsiniz .

Get-ChildItem -Recurse -Depth 2

4
Görünüşe göre -Recurseanahtar -Depthbelirtildiğinde isteğe bağlı / zımni .
— Charlie Joynt

7
Bunda bulduğum garip görünen bir şey -Exclude, dahil -Depthedildiğinde -Depthdeğerin olumsuzlanmasıdır .
— ATek

2
@ssaviers Aynı sorun -Include ile de olur.
— Ebedi 21

Ne olursa olsun, -Depth parametresi joker karakterlerle birleştirildiğinde göz ardı ediliyor gibi görünüyordu. Örneğin, gci c:\*.exe -Depth 1birden çok alt dizin derinliğindeki dosyaları döndürür.
— GuitarPicker

Bunu bildiğim iyi oldu! gci c:\ -filter *.exe -depth 1Muhtemelen istediğini elde ederdi @GuitarPicker Ancak şu anda test etmek için bir Windows makinem yok
— dee-see

9

Bu işlevi deneyin:

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)")
            }
        }
    }
}

kaynak


1
Aslında işe yarıyor. Örnek çağrı: Get-ChildItemToDepth -ToDepth 2(mevcut dizinde çalışıyor)
— Peter Mortensen

1

Resolve-Path kullanarak Get-ChildItem yineleme derinliğini sınırlamaya çalıştım

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

Ancak bu iyi çalışıyor:

gci "$PATH\*\*\*\*"

1

Bu, derinlik seviyesine göre girinti ile öğe başına bir satır çıkaran bir işlevdir. Muhtemelen çok daha okunabilir.

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
            }
        }
    }
}

Pratik PowerShell: Dosya Ağaçlarını Budama ve Cmdlet'leri Genişletme adlı bir blog gönderisine dayanmaktadır .


0

@scanlegentil Bunu beğendim.
Küçük bir gelişme:

$Depth = 2
$Path = "."

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

Belirtildiği gibi, bu yalnızca belirtilen derinliği tarayacaktır, bu nedenle bu değişiklik bir iyileştirmedir:

$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
}

Bu, tüm alt klasör adlarını belirtilen derinliğe kadar
— gösterecektir

1
Bu öğeleri göstermek için görünür de değil, belli bir derinliğe kadar belirli bir derinlikte.
— sancho.s ReinstateMonicaCellio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.