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

How does -InputObject parameter of the Sort-Object cmdlet work?

PowerShell 4.0

我阅读了 Sort-Object cmdlet here(TechNet 页面)。我不明白如何使用 -InputObject 参数。该页面没有示例。我也没有在互联网上找到这个信息。如果能提供使用示例,或包含该信息的 Internet 页面链接,我将不胜感激。

我已经尝试使用它我如何理解它的用途(根据文档):

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

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

谢谢。

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

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

考虑这个例子:

Sort-Object 是这样工作的:

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

    Process
    {
        "'$InputObject'"
    }
}

请注意,数组由管道自动展开,然后在每次迭代中为每个项目分配 $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'

希望这能让你明白。

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

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

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