83

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

Get-ChildItem -recurse

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

4

7 回答 7

113

使用它来将深度限制为 2:

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

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


解释:

这个命令

Get-ChildItem \*\*\*

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

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

于 2012-11-06T11:52:17.930 回答
77

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

您将它与-Recurse限制递归。

Get-ChildItem -Recurse -Depth 2
于 2016-01-25T22:46:24.867 回答
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)")
            }
        }
    }
}

资源

于 2012-11-06T14:39:10.967 回答
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\*\*\*\*"
于 2013-12-12T11:36:05.343 回答
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
            }
        }
    }
}

它基于博客文章Practical PowerShell: Pruning File Trees and Extending Cmdlet

于 2015-05-03T13:44:56.070 回答
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
}
于 2015-01-07T22:05:37.633 回答
0

$path = C:
$depth = 0 #, 0 是基数,1 个文件夹更深,2 个文件夹更深

Get-ChildItem -Path $path -Depth $depth | Where-Object {$_.Extension -eq ".extension"}

于 2021-12-13T11:19:13.447 回答