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.