2012-11-29 45 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參數。