2012-11-29 39 views
1

我正在玩添加成员cmdlet,发现以下三段代码不会给我相同的结果。任何人解释为什么?谢谢。powershell add-member cmdlet问题

################################################################ 
$hash = @{"a" = "aa"; "b" = "bb"} 
$result = new-object psobject 
$result | Add-Member $hash 
$result 

################################################################ 
$hash = @{"a" = "aa"; "b" = "bb"} 
$result = new-object psobject | Add-Member $hash 
$result 

################################################################ 
$hash = @{"a" = "aa"; "b" = "bb"} 
$result = (new-object psobject | Add-Member $hash) 
$result 
+0

在PowerShell v2上都出现错误。在v3中,最后2有相同的行为($ result中没有值),它们对我来说没有意义;)我个人使用'$ result = new-object psobject -Property $ hash' –

回答

2

第一个工作,因为$结果psobject创建是在添加成员之前执行的。第二个2不起作用,因为$ result为空。下面的代码确保语句评估的顺序。

################################################################ 
$hash = @{"a" = "aa"; "b" = "bb"} 
($result = new-object psobject) | Add-Member $hash 
$result 
2

$ hash可能绑定了错误的参数。正确的方法是在成员类型决定(在这个例子中NoteProperty),名称和值:如果分配的结果给一个变量添加-PassThru开关

$result | Add-Member -MemberType NoteProperty -Name MyHash -Value $hash 

$result = new-object psobject | Add-Member -MemberType NoteProperty -Name MyHash -Value $hash -PassThru 
$result.MyHash 
1

Add-Member不会返回任何内容,除非您使用-PassThru参数。

2

您正在使用$ hash作为Add-Member的位置参数。如果您查看添加成员的帮助,在PowerShell v2中,第一个参数是MemberType。所以,你的第一个例子相当于

$result | Add-Member -MemberType @{"a" = "aa"; "b" = "bb"} 

PowerShell中无法解释的哈希表作为MemberType,所以它给出了一个错误。这适用于所有三个例子。

在PowerShell中V3,它解释你的第一个例子是

$result | Add-Member -NotePropertyMembers @{"a" = "aa"; "b" = "bb"} 

正如其他人已经指出的那样,你需要的,如果你正在分配与添加部件上的结果使用-PassThru参数。