的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'

希望这对您来说很清楚。

10-07 14:19