限制Get-ChildItemrecursion深度

我可以使用这个命令recursion地获得所有的子项目:

Get-ChildItem -recurse 

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

你可以试试:

 Get-ChildItem \*\*\* 

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

根据OP限制使用get-childitem进行recursionsearch的问题,您需要指定所有可以search的深度。

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

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

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

你把它和-Recurse结合来限制recursion。

 Get-ChildItem -Recurse -Depth 2 

试试这个function:

 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-ChildItemrecursion深度

 $PATH = "." $folder = get-item $PATH $FolderFullName = $Folder.FullName $PATHs = Resolve-Path $FolderFullName\*\*\*\ $Folders = $PATHs | get-item | where {$_.PsIsContainer} 

但是这工作正常:

 gci "$PATH\*\*\*\*" 

这是每个项目输出一行的function,根据深度级别缩进。 它可能更可读。

 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:修剪文件树和扩展Cmdlet

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