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

And*_*man 3 powershell powershell-4.0

PowerShell 4.0

在这里阅读了有关Sort-Objectcmdlet的信息(TechNet页面).我不明白如何使用-InputObject参数.该页面没有示例.我也没有在互联网上找到这个信息.我将非常感谢它的使用示例,或者用于链接到具有该信息的Internet页面.

我试图用它来了解我的目的(根据文件):

$items = ('a','b','c','d')
$result = sort -InputObject $items -Descending
Run Code Online (Sandbox Code Playgroud)

但是result变量具有与其相同的值items而不是其下降版本.

谢谢.

bea*_*ker 10

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

您的示例无法正常工作,因为当您将集合传递给InputObject参数时,它会被视为单个项目而不会被解包为单个元素,因此它不会被排序.这允许您对集合的集合进行排序.

考虑这个例子:

这是如何Sort-Object工作:

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

    Process
    {
        "'$InputObject'"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

PS> $items | Add-Quotes
'a'
'b'
'c'
'd'
Run Code Online (Sandbox Code Playgroud)

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

PS> Add-Quotes -InputObject $items
'a b c d'
Run Code Online (Sandbox Code Playgroud)

有时它是一种理想的行为,有时你需要打开集合,无论它们来自哪里.在这种情况下,您使用内部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'
Run Code Online (Sandbox Code Playgroud)

希望这能让你清楚.