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