如何通过管道向Get-Process传递-id参数?为何需用ForEach-Object?
问题原因解析
首先纠正一个用法错误:当使用按属性名(ByPropertyName)管道传递参数时,你不需要手动指定-Id $_.Id,正确的直接管道写法应该是:
$obj = [pscustomobject]@{id=4444} # 这才是正确的直接管道用法,能正常运行 $obj | Get-Process
你原来写的$obj | Get-Process -Id $_.Id之所以无效,核心原因是**$_这个自动变量在当前语境下没有被定义**:
- 当你直接给
Get-Process的-Id参数写$_.Id时,PowerShell会先解析这个参数值,而此时管道里的$obj还没被传递到Get-Process的参数绑定逻辑中,$_并不指向任何对象,相当于传递了一个无效值,自然无法获取进程。
而用ForEach-Object的写法能正常运行,是因为:
- 在
ForEach-Object的脚本块({})内部,PowerShell会自动把管道当前传递的对象赋值给$_,此时$_.Id能正确获取到$obj的id属性值4444,再把这个值传递给Get-Process -Id,自然能正常执行。
简单总结:
- 直接管道按属性名传参时,不需要手动引用
$_,PowerShell会自动匹配同名属性到对应参数; $_只有在脚本块(比如ForEach-Object、Where-Object的花括号里)才会被自动赋值为当前管道对象。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

