按字母顺序、深度优先顺序递归迭代?

Iterating recursively in alphabetic, depth-first order?

如何遍历文件夹以遵守字母(词汇)顺序,但在移至旧目录的下一个项目之前递归到任何目录?

用于说明的示例结构:

Alpha
  |- 1.txt
  |- 2.txt
  |- 3
  |  |- a.txt
  |  \- b.txt
  \- 4.txt
Beta
  \- Test
     \- Another
        \- File.txt

我想以这样一种方式进行迭代,如果我要打印所有经过的项目,结果将如下所示:

Alpha
1.txt
2.txt
3
a.txt
b.txt
4.txt
Beta
Test
Another
File

但是,我似乎无法弄清楚如何在不使用手动递归将嵌套 Get-ChildItem 弄得一团糟的情况下正确地执行递归和排序,但我希望有一个我也可以学习的更简洁的方法。

如果由于某种原因这太难实现,保留项目的处理顺序是对我来说重要的底线,因为如果必须的话,我可以在不保留树结构的情况下做到这一点。

无需手动递归,当您同时使用 Sort-ObjectSelect-Object.

时,Get-ChildItem 将执行您想要的操作
  • Get-ChildItem 使用递归获取您的项目列表
  • sort 通过 FullName 将项目按您想要的顺序排列
  • select Name 属性 仅显示项目名称

给出:

Get-ChildItem C:\folder -Recurse | sort FullName | select -ExpandProperty Name

Alpha
1.txt
2.txt
3
a.txt
b.txt
4.txt
Beta
Test
Another
file.txt

可以用一个简单的递归包装函数来解决:

function Get-ChildItemDepthFirst
{
  param(
    [Parameter(Mandatory = $true)]
    [ValidateScript({Test-Path $_ -PathType Container})]
    [string]$LiteralPath = $PWD
  )

  foreach($item in Get-ChildItem @PSBoundParameters){
    # Output current item name
    $item.Name
    # Check to see if item is a folder, if so recurse
    if($item -is [System.IO.DirectoryInfo]){
      Get-ChildItemDepthFirst -LiteralPath $item.FullName
    }
  }
}

FWIW,我个人会选择