我有一个
[pscustomobject]
和一个属性 id
。根据 PowerShell 文档,参数“-id”可以使用 ByPropertyName
通过管道传递。我发现使用 ForEach-Object
的方法有效(虽然我不明白为什么),而没有 ForEach-Object
的方法则不行。
$obj = [pscustomobject]@{id=4444}
# doesn't work
$obj | get-process -id $_.id
# it works
$obj | foreach{get-process -id $_.id}
显然“foreach”可以解决问题,但为什么呢?
参数指示该参数接受来自管道对象的属性的输入。对象属性必须与参数具有相同的名称或别名。ValueFromPipelineByPropertyName
$_
(PSItem)仅在脚本块的上下文中自动填充,并且您的第二条语句没有脚本块。
$obj = [pscustomobject]@{ id = 4444 }
# works, the value of `id` is taken from pipeline
$obj | Get-Process
至于为什么
ForEach-Object
示例有效,仅仅是因为您将 id
属性的值作为参数传递给 -Id
参数,它几乎与:
Get-Process -Id $obj.Id