【问题标题】:Calling Sort-Object without pipe in PowerShell在 PowerShell 中调用无管道的 Sort-Object
【发布时间】:2013-03-18 10:13:18
【问题描述】:

我是 PowerShell 新手,只是想弄清楚它是如何工作的。

那么,我该如何编写这段代码:

Get-ChildItem C:\ | Sort-Object Length

作为多行代码?我试过这个:

$child_items = Get-ChildItem C:\
Sort-Object $child_items Length

但它没有工作。我得到:

Sort-Object : A positional parameter cannot be found that accepts argument 'Length'.

【问题讨论】:

    标签: powershell pipe


    【解决方案1】:

    虽然其他答案是使用命名参数传递值的正确方法,但请记住 get-help Sort-Object 所说的内容:

    When you use the InputObject parameter to submit a collection of items, 
    Sort-Object receives one object that represents the collection. 
    Because one object cannot be sorted, Sort-Object returns the entire collection unchanged.
    

    您会发现将 $child_items 传递给-inputobject 不会进行任何排序操作。

    您总是需要使用管道将值传递给-inputobject

    【讨论】:

    【解决方案2】:

    您需要指定 -InputObject 参数。没有它,$child_items 将绑定到第一个位置参数,即 'Property'

    Sort-Object -InputObject $child_items Length
    

    更新

    我没有删除我的答案,因为它附有 cmets。我错了,Get-ChildItem 的结果是默认排序的,我得出结论,将数组传递给 InputObject 就可以了。显然我错了,请检查@C.B 答案。

    【讨论】:

    • 虽然脚本以此运行,但对象不再排序。为什么会这样?
    • @SebastianKrysmanski Sort-Object 的结果你在做什么?请记住,它不会就地排序。
    • 我只想将其结果写入控制台(以便它与管道替代的输出相匹配)。
    【解决方案3】:

    这可行:

    Get-ChildItem C:\ | 
    Sort-Object Length
    

    或者以你为例,这也可以;

    $child_items = Get-ChildItem C:\
    $child_items | Sort-Object Length
    

    您也可以使用反引号作为续行字符。

    【讨论】:

    • 我会说他应该使用反引号 ` ,因为如果没有它,一些 cmdlet 将无法运行,至少不会始终如一,并且它使其更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2014-02-13
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多