PowerShell管道输出后续传递问题求助:为何无法继续处理结果
PowerShell管道问题解析
先给你理清楚管道的核心逻辑:PowerShell管道是把前一个命令输出的对象,逐个传递给下一个命令处理。$_这个自动变量,只有在脚本块{}内部才代表当前正在处理的管道对象,出了脚本块它就不生效了。
写法1的错误原因
Get-Process | Where-Object { $_.ProcessName -match 'acc' } | Select-Object -Property id, Name | write-host $_.name
这里的问题有两个:
Write-Host默认不接收管道输入,它不会主动获取前一个命令的输出对象。$_.name写在脚本块之外,此时$_是空值,根本取不到管道传来的对象属性。
要实现你想要的输出,得用ForEach-Object把Write-Host包在脚本块里,让$_能正确指代管道对象:
Get-Process | Where-Object { $_.ProcessName -match 'acc' } | Select-Object -Property id, Name | ForEach-Object { Write-Host $_.Name }
写法2的错误原因
Get-Process | Where-Object { $_.ProcessName -match 'acc' } | Select-Object -Property id, Name | $_
$_是PowerShell的自动变量,不是可执行命令。管道右侧必须是能处理输入的命令(比如Where-Object、ForEach-Object这类),直接放$_完全不符合语法规则,必然报错。
内容的提问来源于stack exchange,提问作者Vsn
相关产品推荐
相关产品推荐

