限制Get-ChildItem递归深度

时间:2012-11-06 10:30:38

标签: powershell

我可以使用此命令递归获取所有子项:

Get-ChildItem -recurse

但有没有办法限制深度?例如,如果我只想降低一个或两个级别?

5 个答案:

答案 0 :(得分:96)

您可以尝试:

Get-ChildItem \*\*\*

这将返回深度为两个子文件夹的所有项目。添加\ *会添加一个额外的子文件夹来搜索。

根据使用get-childitem限制递归搜索的OP问题,您需要指定可以搜索的所有深度。

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

将在每个深度2,1和0返回孩子

答案 1 :(得分:47)

As of powershell 5.0,您现在可以使用-Depth中的Get-ChildItem参数!

将它与-Recurse结合使用以限制递归。

Get-ChildItem -Recurse -Depth 2

答案 2 :(得分: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)")
            }
        }
    }
}

source

答案 3 :(得分: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\*\*\*\*"

答案 4 :(得分: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
}