【问题标题】:How can I control the order of processing items in/from get-childitem -recurse如何控制在/从 get-childitem -recurse 中处理项目的顺序
【发布时间】:2012-03-02 00:41:00
【问题描述】:

试图教育自己:在处理来自

的整个项目树时

get-childitem -recurse

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

为了解决这个问题,我采用了按路径中分隔符的数量对整个集合进行排序,首先获取叶级别,然后是树的上层:

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

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以避免使用正则表达式而只使用字符串拆分方法。它的性能也更好。

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

    结果:

    TotalMilliseconds : 346.1253
    

    对...

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

    结果:

    TotalMilliseconds : 953.6606
    

    【讨论】:

    • 这加快了速度,mjolinor 也是正确的,只是路径的长度应该起作用(孩子可能比其他人短,但不能比他们的父母短)。我只是想通过使用更好的树遍历方法以正确的顺序提供集合来完全消除整个排序。学术,我猜,但我很好奇:-)
    【解决方案2】:

    我只是使用全名的长度:

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

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

    【讨论】:

    • 我认为 OP 正在尝试按文件夹深度而不是路径长度进行排序。
    • 好的。但是,如果您要删除整个文件夹树,并且只需要确保在删除父项的所有子项之前不要尝试删除父项,它就会完成同样的事情。
    • 我不太明白那部分,因为很明显,当父母被删除时,所有的孩子都会被删除,那有什么关系呢?但是根据当前示例,它是按文件夹深度计算的,因此 C:\ShortName\A\B 将在 C:\A really really long folder name 之前的数组中
    • 根据您用于删除的内容,如果文件夹中仍有子项,它可能会大惊小怪。至于“C:\A 非常长的文件夹名称”在“C:\ShortName\A\B”之前的列表中,如果您要删除它们都没有关系,只要所有子项任何一个文件夹都在该文件夹之前的列表中。
    • 是的,主要问题是如果您先删除父文件夹(或更改它),然后在循环中稍后尝试访问不再存在的内容时会抛出错误。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2014-01-08
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多