奇怪的PowerShell行为和Add-Member

时间:2013-05-15 21:39:42

标签: powershell powershell-v3.0

有人可以帮助我理解为什么$ _对Add-Member函数的工作方式与其他PowerShell函数的工作方式不同?我必须在这里找到一些细微差别。

使用下面的示例CSV文件,前3个示例正常工作。第四个看起来非常简单,但却没有。 Powershell返回的错误是:

The variable '$_' cannot be retrieved because it has not been set.

这是“正常”还是我错误编码了什么?

提前致谢。

Test.csv
Column1,Column2, Column3
Rock,1,abc
Paper,2,efg
Scissors,3,hij

$obj = Import-CSV "C:\test.csv"

(1) $obj | Add-Member -MemberType NoteProperty -Name IdNumber -value "ROCK" -PassThru| Format-Table

(2) $obj | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name IdNumber -value $_.Column1 ; $_} | Format-Table

(3) $obj | ForEach-Object { Add-Member -InputObject $_ -MemberType NoteProperty -Name IdNumber -value $_.Column1 ; $_ } | Format-Table

(4) $obj | Add-Member -MemberType NoteProperty -Name IdNumber -value $_.Column1 -PassThru| Format-Table

1 个答案:

答案 0 :(得分:4)

执行此操作时:

$obj | Add-Member -MemberType NoteProperty -Name IdNumber -value $_.Column1 -PassThru

您正在管道绑定上下文之外访问$_,例如在foreach-object表达式内或在为管道绑定参数指定的scriptblock值内。 Value参数不受管道限制。如果是的话,你可以这样做:

$obj | Add-Member -MemberType NoteProperty -Name IdNumber -value {$_.Column1} -PassThru

目前,做你想做的最简单的方法是:

$obj | ForEach-Object { Add-Member -Inp $_ NoteProperty -Name IdNumber -Value $_.Column1 -PassThru } | Format-Table