PowerShell:将管道对象转换为管道对象



如果相关,我正在使用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中为每个元素创建一个新范围,Where1..2 | ForEach { $_ }或 ScriptBlock 参数(如select @{N='calculated property'; E={$_.foo}}中的Expression)。

最新更新