Sort-Object cmdlet的-InputObject参数如何工作?

时间:2016-02-09 10:32:56

标签: powershell powershell-v4.0

PowerShell 4.0

我了解了Sort-Object cmdlet here(TechNet页面)。我不明白如何使用-InputObject参数。那个页面没有它的例子。我也没有在互联网上找到这个信息。我将非常感谢它的使用示例,或者链接到具有该信息的Internet页面。

我试图使用我如何理解其目的(根据文档):

$items = ('a','b','c','d')
$result = sort -InputObject $items -Descending

但是result变量与items变量具有相同的值,而不是它的下降版本。

谢谢。

2 个答案:

答案 0 :(得分:8)

InputObject是用于获取管道输入的参数的通用名称。它是内部PowerShell命名约定的一部分,没有什么特别之处。

您的示例并不像您认为的那样有效,因为当您将集合传递给InputObject参数时,它会被视为单个项目而不会被解包为单个元素,因此它没有排序。这允许您对集合集合进行排序。

考虑这个例子:

这就是Sort-Object的工作原理:

function Add-Quotes
{
    Param
    (
        [Parameter(ValueFromPipeline = $true)]
        $InputObject
    )

    Process
    {
        "'$InputObject'"
    }
}

请注意,数组由管道自动解包,然后在每次迭代中为idividial项分配$InputObject变量,然后在Process块中处理:

PS> $items | Add-Quotes
'a'
'b'
'c'
'd'

但是当你将一个集合传递给InputObject时,它没有被迭代过,因为没有管道来解开它:

PS> Add-Quotes -InputObject $items
'a b c d'

有时它是一种理想的行为,有时你需要打开收藏品,无论它们来自哪里。在这种情况下,您使用内部foreach循环来执行此操作:

function Add-Quotes
{
    Param
    (
        [Parameter(ValueFromPipeline = $true)]
        [string[]]$InputObject
    )

    Process
    {
        foreach($item in $InputObject)
        {
            "'$item'"
        }
    }
}

PS > $items | Add-Quotes
'a'
'b'
'c'
'd'

PS > Add-Quotes -InputObject $items
'a'
'b'
'c'
'd'

希望这能让你清楚。

答案 1 :(得分:1)

函数的进程块自动处理管道上的集合,但是如果它作为命令行参数传递则不会。一些cmdlet放入一个额外的foreach循环来处理-inputobject集合或列表,但大多数没有。

但是,任何可以从管道获取输入的参数也可以从命令行获取脚本块。所以这可能会在某个时候派上用场。你会在帮助中看到这样的例子。

PS C:\> echo a,b,c,d | sort -InputObject { $_.ToUpper() } -Descending
D
C
B
A