如果相关,我正在使用Powershell 5
将属性添加到管道中的当前项时:
在我将其输入另一个管道之前,我无法引用$_。为什么?
# make some objects to pass around
$test = (0..3) | %{[pscustomobject]@{key1="v$_.1";key2="v$_.2"} }
# GM = TypeName: System.Management.Automation.PSCustomObject
# trying to use the current pipeline object
$test | Add-Member @{key3=$_.key1}
$test | ft *
key1 key2 key3
---- ---- ----
v0.1 v0.2
v1.1 v1.2
v2.1 v2.2
v3.1 v3.2
# try again, this time taking the current pipeline object...
#... and then putting it into another identical looking pipeline
$test | %{ $_ | Add-Member @{key4=$_.key1} }
$test | ft *
key1 key2 key3 key4
---- ---- ---- ----
v0.1 v0.2 v0.1
v1.1 v1.2 v1.1
v2.1 v2.2 v2.1
v3.1 v3.2 v3.1
我怀疑可能是第一个自动暗示某些东西,我没有告诉不可见/暗示的函数传递$PSItem。
在命令开始之前,将在当前范围内计算所有参数,而不考虑在管道中的语法使用。因此,$test | Add-Member @{key3=$_.key1}
使用当前范围内的$_
,这意味着它不是$test
中的一个元素。
要为管道中的每个元素评估$_
,应该通过 ScriptBlock(大括号中的代码)在ForEach
中为每个元素创建一个新范围,Where
如1..2 | ForEach { $_ }
或 ScriptBlock 参数(如select @{N='calculated property'; E={$_.foo}}
中的E
xpression)。