按字母顺序、深度优先顺序递归迭代?
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-Object
和 Select-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,我个人会选择
如何遍历文件夹以遵守字母(词汇)顺序,但在移至旧目录的下一个项目之前递归到任何目录?
用于说明的示例结构:
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-Object
和 Select-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,我个人会选择