如何控制get-childitem -recurse中处理项目的顺序

时间:2012-03-02 00:41:00

标签: powershell

尝试教育自己:从

处理整个项目树时

get-childitem -recurse

我经常要从叶级到顶级执行它(例如,删除文件和文件夹,修改树的上层然后尝试处理较低级别是有问题的。

要解决这个问题,我已经根据路径中的分隔符数量对整个集合进行排序,首先获得叶级别,然后是树的上层:

$someFiles = Get-ChildItem -Recurse | Sort @{Expression={ ( $_.fullname | select-string "\\" -AllMatches ).matches.count }; Descending=$true }

这感觉不对 - 我的编码经验有限,但我知道如果我只是以正确的方式遍历树,那么这种昂贵且愚蠢的排序不应该是必要的。但是 - 安全是如此方便!

更聪明的方法是什么?具体来说,有没有办法使用get-childitem遍历树,从叶子向上,不需要对所有结果进行排序?

2 个答案:

答案 0 :(得分:3)

您可以避免使用正则表达式,只需使用字符串拆分方法即可。它也表现得更好。

dir -recurse | sort -Property @{ Expression = {$_.FullName.Split('\').Count} } -Desc

结果:

TotalMilliseconds : 346.1253

... VS

Get-ChildItem -Recurse | Sort @{Expression={ ( $_.fullname | select-string "\\" -AllMatches ).matches.count }; Descending=$true }

结果:

TotalMilliseconds : 953.6606

答案 1 :(得分:2)

我只使用全名的长度:

gci -recurse | sort @{expression = {$_.fullname.length}} -descending

所有子项都将在其父容器之前进行排序。