2009-09-05 106 views
4

我想在數組中的所有項目上使用PowerShell添加成員cmd,然後訪問稍後添加的成員,但它不顯示。PowerShell添加成員到數組項目

您可以在下面的代碼的輸出中看到NoteProperty看起來存在於foreach語句的範圍內,但它不在該範圍之外的同一對象上。

任何方式讓這個腳本顯示isPrime兩次調用Get-Member?

$p = @(1) 
$p[0] | %{ add-member -inputobject $_ -membertype noteproperty -name isPrime -value $true; $_ | gm } 
$p[0] | gm 

輸出

TypeName: System.Int32 

Name  MemberType 
----  ---------- 
CompareTo Method  
Equals  Method  
GetHashCode Method  
GetType  Method  
GetTypeCode Method  
ToString Method  
isPrime  NoteProperty 


CompareTo Method  
Equals  Method  
GetHashCode Method  
GetType  Method  
GetTypeCode Method  
ToString Method 

回答

5

你正在運行到的問題是,如圖1所示,一個整數,是在.NET值類型,當它被在其周圍被複制傳遞(由值傳遞)。因此,您成功修改了1的副本,但不是數組中的原始副本。你可以看到這一點,如果你框(或CAST)的1到一個對象(引用類型),例如:

$p = @([psobject]1) 
$p[0] | %{ add-member NoteProperty isPrime $true; $_ | gm } 
$p[0] | gm 

OP(spoon16)回答

這是我在我的腳本代碼實際上是如何結束看起來。如果這可以優化,請隨時編輯。

$p = @() #declare array 
2..$n | %{ $p += [psobject] $_ } #initialize 
$p | add-member -membertype noteproperty -name isPrime -value $true 
+0

很好的答案和漂亮的KTM – 2009-09-05 05:27:19

+0

謝謝! KTM和摩押(在那裏被採取)一起非常好地走在一起。 :-) – 2009-09-05 10:26:52

2

我將優化,通過鍵入少:

$p | add-member noteproperty isPrime $true 
+0

謝謝! – 2009-09-06 03:14:04