我可以使用以下命令递归获取所有子项目:
Get-ChildItem -recurse
但是有办法限制深度吗?例如,如果我只想向下递归一两个级别?
Answers:
使用此功能将深度限制为2:
Get-ChildItem \*\*\*,\*\*,\*
它的工作方式是返回每个深度2,1和0的子代。
说明:
这个命令
Get-ChildItem \*\*\*
返回深度为两个子文件夹的所有项目。添加\ *将添加另一个要搜索的子文件夹。
与OP问题一致,要限制使用get-childitem进行递归搜索,您需要指定所有可以搜索的深度。
Get-ChildItem .\*\*\*,.\*\*,.\*
在某些时候,通过PowerShell 5.1,Get-ChildItem现在具有一个-Depth
参数。
从powershell 5.0开始,您现在可以在-Depth
中使用参数Get-ChildItem
!
您可以结合使用-Recurse
以限制递归。
Get-ChildItem -Recurse -Depth 2
-Recurse
开关是可选的/隐含的-Depth
。
-Exclude
,将其包括在内会-Depth
否定该-Depth
值。
gci c:\*.exe -Depth 1
返回文件深入多个子目录。
gci c:\ -filter *.exe -depth 1
可能会为您提供所需的@GuitarPicker我现在没有Windows计算机可以进行测试
试试这个功能:
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)")
}
}
}
}
Get-ChildItemToDepth -ToDepth 2
在当前目录上工作)
该功能每项输出一行,并根据深度级别缩进。它可能更具可读性。
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
}
}
}
}
它基于博客文章《实用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
}