支持PS3.0以后
当你使用Get-Ghilditem去列出文件夹的内容时,你可以添加一个-Recurse参数去获取里面的子目录。然而,这不能让你控制其嵌套层数。GC将查询整个子目录,而不会关心它是否有很多嵌套层。
Get-ChildItem -Path $env:windir -Filter *.log -Recurse -ErrorAction SilentlyContinue
有时,你可以看到这种限制嵌套层数的方案:
Get-ChildItem -Path $env:windir\*\*\* -Filter *.log -ErrorAction SilentlyContinue
然而,这不是限制嵌套三层范围,而是查询全部的第三层目录。下面这个则不会,例如获取一、二层目录所有内容。
限制嵌套的层数唯一的方式就是递归自己:
function Get-MyChildItem
{
param
(
[Parameter(Mandatory = $true)]
$Path,
$Filter = '*',
[System.Int32]
$MaxDepth = 3,
[System.Int32]
$Depth = 0
)
$Depth++
Get-ChildItem -Path $Path -Filter $Filter -File
if ($Depth -le $MaxDepth)
{
Get-ChildItem -Path $Path -Directory |
ForEach-Object { Get-MyChildItem -Path $_.FullName -Filter $Filter -Depth $Depth -MaxDepth $MaxDepth}
}
}
Get-MyChildItem -Path c:\windows -Filter *.log -MaxDepth 2 -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty FullName
本次执行将从WINDOWS目录及其2层内得到全部的*.log文件。
本文链接: https://www.pstips.net/recursing-a-given-depth.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

这样直接的递归调用,可能会出现stackoverflow 问题,最好转化成非递归。