PowerShell 4.0
我了解了Sort-Object
cmdlet here(TechNet页面)。我不明白如何使用-InputObject
参数。那个页面没有它的例子。我也没有在互联网上找到这个信息。我将非常感谢它的使用示例,或者链接到具有该信息的Internet页面。
我试图使用我如何理解其目的(根据文档):
$items = ('a','b','c','d')
$result = sort -InputObject $items -Descending
但是result
变量与items
变量具有相同的值,而不是它的下降版本。
谢谢。
答案 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