限制Get-ChildItem递归深度

Svi*_*ish 74 powershell

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

Get-ChildItem -recurse
Run Code Online (Sandbox Code Playgroud)

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

CB.*_*CB. 101

你可以试试:

Get-ChildItem \*\*\*
Run Code Online (Sandbox Code Playgroud)

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

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

Get-ChildItem \*\*\*,\*\*,\*
Run Code Online (Sandbox Code Playgroud)

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

  • 好像你必须做"-path \\*\\*\\*,\\*\\*,\\*"来拉入中间深度. (14认同)
  • 要从当前目录开始递归,需要在每个路径的开头添加一个点。`Get-ChildItem。\ * \ * \ * ,. \ * \ * ,. \ *`在某些时候,通过PowerShell 5.1,Get-ChildItem现在具有一个-Depth参数。 (2认同)

dee*_*see 52

从PowerShell 5.0开始,您现在可以使用-Depth参数Get-ChildItem!

您将它与-Recurse限制递归相结合.

Get-ChildItem -Recurse -Depth 2
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个看起来很奇怪的一件事是`-Exclude`当包含在`-Depth`中否定`-Depth`值. (4认同)
  • 当指定`-Depth`时,似乎`-Recurse`开关是可选的/隐含的. (3认同)
  • @ssaviers -Include 也会出现同样的问题。 (3认同)

wal*_*2mi 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)")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

资源