Get-ChildItem 재귀 수준 제한


82

이 명령을 사용하여 모든 하위 항목을 재귀 적으로 가져올 수 있습니다.

Get-ChildItem -recurse

그러나 깊이를 제한하는 방법이 있습니까? 예를 들어 한두 단계 만 되풀이하려면?

답변:


109

이를 사용하여 깊이를 2로 제한합니다.

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

작동 방식은 각 깊이 2,1 및 0에서 자식을 반환하는 것입니다.


설명:

이 명령

Get-ChildItem \*\*\*

깊이가 두 개의 하위 폴더 인 모든 항목을 반환합니다. \ *를 추가하면 검색 할 하위 폴더가 추가됩니다.

OP 질문에 따라 get-childitem을 사용하여 재귀 검색을 제한하려면 검색 할 수있는 모든 깊이를 지정해야합니다.


너무 멋져요. PowerShell에서이 작업을 수행 할 필요가 없었던 것 같지만 CMD.EXE에서 이전에 원했던 것을 알고 있습니다.
aphoria

15
중간 수심을 당기려면 "-path \ * \ * \ *, \ * \ *, \ *"를 수행해야하는 것 같습니다.
Gerard ONeill 2013 년

시도해 보았지만 아래로가 아니라 위로 올라가는 것 같습니다. superuser.com/questions/258287/… 에서와 같이 폴더 트리를 생성하려면 어떻게 사용 합니까? 감사합니다.
Royi

2
현재 디렉토리에서 재귀를 시작하려면 각 경로의 시작 부분에 점을 추가해야합니다. Get-ChildItem .\*\*\*,.\*\*,.\*어떤 시점에서 PowerShell 5.1에서 Get-ChildItem에는 이제 -Depth매개 변수가 있습니다.
점등

65

powershell 5.0 부터 이제 ! 에서 -Depth매개 변수를 사용할 수 있습니다 Get-ChildItem.

-Recurse재귀를 제한하기 위해 결합합니다 .

Get-ChildItem -Recurse -Depth 2

4
-Recurse스위치 -Depth가 지정 되었을 때 선택 / 묵시적으로 보입니다 .
Charlie Joynt

7
이상하게 보이는 한 가지 발견은 -Exclude포함 -Depth하면 -Depth값 이 부정 된다는 것 입니다.
ATek 2017 년

2
@ssaviers -Include에서도 같은 문제가 발생합니다.
Eternal21

그만한 가치는 와일드 카드와 결합 할 때 -Depth 매개 변수가 무시되는 것처럼 보였습니다. 예를 들어 gci c:\*.exe -Depth 1는 여러 하위 디렉터리 깊이 파일을 반환합니다.
GuitarPicker

알아 둘만 한! gci c:\ -filter *.exe -depth 1@GuitarPicker 원하는 것을 얻을 수있을 것입니다.하지만 지금은 테스트 할 Windows 시스템이 없습니다.
dee-see

9

이 기능을 시도하십시오 :

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

출처


1
실제로 작동합니다. 샘플 호출 : Get-ChildItemToDepth -ToDepth 2(현재 디렉토리에서 작업 중)
Peter Mortensen

1

Resolve-Path를 사용하여 Get-ChildItem 재귀 깊이를 제한하려고했습니다.

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

그러나 이것은 잘 작동합니다.

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

1

깊이 수준에 따라 들여 쓰기하여 항목 당 한 줄씩 출력하는 기능입니다. 아마도 훨씬 더 읽기 쉬울 것입니다.

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

이는 블로그 게시물 Practical PowerShell : Pruning File Trees and Extending Cmdlet을 기반으로 합니다.


0

@scanlegentil 나는 이것을 좋아한다.
약간의 개선은 다음과 같습니다.

$Depth = 2
$Path = "."

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

언급했듯이 이것은 지정된 깊이 만 스캔하므로이 수정은 개선 된 것입니다.

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

이렇게하면 지정된 깊이까지 모든 하위 폴더 이름이 표시됩니다
kevro

1
이 항목을 표시하는 표시 하지, 주어진 깊이 까지 주어진 깊이.
sancho.s ReinstateMonicaCellio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.