限制Get-ChildItem递归深度


82

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

Get-ChildItem -recurse

但是有办法限制深度吗?例如,如果我只想向下递归一两个级别?

Answers:


109

使用此功能将深度限制为2:

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

它的工作方式是返回每个深度2,1和0的子代。


说明:

这个命令

Get-ChildItem \*\*\*

返回深度为两个子文件夹的所有项目。添加\ *将添加另一个要搜索的子文件夹。

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


好棒。我想我从来不需要在PowerShell中执行此操作,但是我知道我之前曾希望在CMD.EXE中执行此操作。
Aphoria 2012年

15
似乎您必须执行“ -path \ * \ * \ *,\ * \ *,\ *”才能拉入中间深度。
Gerard ONeill 2013年

我尝试过,但它似乎上升而不是下降。我如何像superuser.com/questions/258287/…一样使用它生成文件夹树?谢谢。
罗伊

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
查理·乔伊特

7
我发现这一点似乎很奇怪的一件事是-Exclude,将其包括在内会-Depth否定该-Depth值。
ATek

2
@ssaviers -Include也发生相同的问题。
Eternal21 '19

值得一提的是,与通配符结合使用时-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
            }
        }
    }
}

它基于博客文章《实用PowerShell:修剪文件树和扩展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 2015年

1
这似乎显示项目给定的深度,而不是达到一定深度。
sancho.s ReinstateMonicaCellio'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.