programing

Get-ChildItem 재귀 깊이 제한

skycolor 2023. 4. 12. 22:00
반응형

Get-ChildItem 재귀 깊이 제한

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

Get-ChildItem -recurse

하지만 깊이를 제한하는 방법은 없을까?예를 들어 한두 단계만 반복하고 싶은 경우?

이를 통해 깊이를 2로 제한합니다.

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

작동 방식은 각 깊이 2, 1, 0에 있는 아이들을 돌려주는 것입니다.


설명:

이 명령어

Get-ChildItem \*\*\*

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

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

powershell 5.0 이후로는-Depth매개 변수Get-ChildItem!

그것을 조합하다-Recurse재귀를 제한합니다.

Get-ChildItem -Recurse -Depth 2

다음 기능을 사용해 보십시오.

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

원천

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

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

하지만 이 방법은 잘 작동합니다.

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

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

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 Cmdlets를 기반으로 합니다.

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

$path = C:
$depth = 0 #, 0은 베이스, 1폴더 깊이, 2폴더 깊이

Get-Child Item - Path $Path - Depth $Depth | Where-Object {$}.확장자 -eq ".extension"}

언급URL : https://stackoverflow.com/questions/13249085/limit-get-childitem-recursion-depth

반응형