Powershell 限制Get ChildItem递归深度

Powershell 限制Get ChildItem递归深度,powershell,Powershell,我可以使用以下命令递归获取所有子项: Get-ChildItem -recurse 但是有没有办法限制深度呢?例如,如果我只想向下递归一个或两个级别?使用此选项将深度限制为2: Get-ChildItem \*\*\*,\*\*,\* 它的工作方式是返回每个深度为2、1和0的子级 说明: 此命令 Get-ChildItem \*\*\* 返回深度为两个子文件夹的所有项目。添加\*添加要搜索的其他子文件夹 根据OP问题,要使用get childitem限制递归搜索,需要指定可以搜索的所有深

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

Get-ChildItem -recurse

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

使用此选项将深度限制为2:

Get-ChildItem \*\*\*,\*\*,\*
它的工作方式是返回每个深度为2、1和0的子级


说明:

此命令

Get-ChildItem \*\*\*
返回深度为两个子文件夹的所有项目。添加\*添加要搜索的其他子文件夹

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

尝试此功能:

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\*\*\*\*"

@我喜欢这个。
有一点改进是:

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

这是一个函数,每个项目输出一行,并根据深度级别进行缩进。它可能更具可读性

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
            }
        }
    }
}
它基于一篇博客文章。

,您现在可以在
获取ChildItem
中使用
-Depth
参数

您可以将其与
-Recurse
组合以限制递归

Get-ChildItem -Recurse -Depth 2

太棒了。我想我从来都不需要在PowerShell中这样做,但我知道我以前在CMD.EXE中希望这样做。似乎你必须执行“-path\*\*\*,\*\*,\**,\*”来拉入中间深度。我尝试过,但它似乎上升而不是下降。如何使用它生成文件夹树,如中所示?谢谢。要从当前目录开始递归,需要在每个路径的开头添加一个点
Get ChildItem.\*\*、.\*\*、.\*
在某些情况下,通过PowerShell 5.1,Get ChildItem现在有一个
-Depth
参数。这将显示指定深度的所有子文件夹名称这将显示给定深度的项目,未达到给定深度。指定
-depth
时,
-Recurse
开关似乎是可选的/隐含的。我发现一件奇怪的事情是
-Exclude
当包含在
-depth
中时,会否定
-depth
值。@ssaviers同样的问题也会发生在-Include上。至于它是什么在与通配符组合时,-Depth参数似乎被忽略。例如,
gcic:\*.exe-Depth 1
返回多个子目录深的文件。很高兴知道
gci c:\-filter*.exe-depth 1
可能会让你得到你想要的@GuitarPicker我现在没有一台windows机器来测试它到底是如何工作的。调用示例:
获取ChildItemToDepth-ToDepth 2
(在当前目录下工作)