我可以使用此命令递归获取所有子项:
Get-ChildItem -recurse
但有没有办法限制深度?例如,如果我只想降低一个或两个级别?
答案 0 :(得分:96)
您可以尝试:
Get-ChildItem \*\*\*
这将返回深度为两个子文件夹的所有项目。添加\ *会添加一个额外的子文件夹来搜索。
根据使用get-childitem限制递归搜索的OP问题,您需要指定可以搜索的所有深度。
Get-ChildItem \*\*\*,\*\*,\*
将在每个深度2,1和0返回孩子
答案 1 :(得分:47)
As of powershell 5.0,您现在可以使用-Depth
中的Get-ChildItem
参数!
将它与-Recurse
结合使用以限制递归。
Get-ChildItem -Recurse -Depth 2
答案 2 :(得分: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)")
}
}
}
}
答案 3 :(得分: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\*\*\*\*"
答案 4 :(得分: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
}