支持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 问题,最好转化成非递归。