2013-11-01 25 views
0

下面是我一直試圖克服的一些奇怪的例子,最終的結果是我想要一個新的變量與組合的哈希表,但不修改兩個原始哈希表。Powershell Hashtable添加/刪除方法影響所有可變參數。

例如:我有兩個哈希表。

$User = @{ 
     "Name" = "Jane Doe" 
     "Location" = "Work" 
     } 
    $Details = @{ 
     "hair" = "Brown" 
     "Eyes" = "Blue" 
     "Height" = "68" 
     } 

我想添加一個到另一個,並將結果複製到一個新的變量。幾個例子:

$newHash = $User.add("Details",$Details) 

    ($newHash = $User).add("Details",$Details) 

    $newHash = $User 
    $newHash.add("Details",$Details) 

最後兩項工作在添加細節,但它們將它添加到$ newHash和$ User!如果運行第三個示例,然後刪除詳細信息:

$User.Remove("Details") 

它將其從$ User和$ newHash中移除!我似乎無法解決這種行爲,建議非常感謝!

回答

3

試試這個:

$User = @{ 
      "Name" = "Jane Doe" 
      "Location" = "Work" 
    } 
$Details = @{ 
      "hair" = "Brown" 
      "Eyes" = "Blue" 
      "Height" = "68" 
      } 

$newHash = $User.clone() 
$newHash.Add('Details',$details) 
+0

完美的作品,這麼簡單的事情是讓我瘋了。感謝mjolinor! – user1178954

+0

它可以做到這一點。 DAMHIKT – mjolinor

1

我想指出的是,這是不奇怪的行爲,但實際上是由設計是非常重要的。當你說

$newHash = $User 

你正在做$用戶的淺拷貝,現在無論$ newHash和$用戶指向相同的內存空間。換句話說,$ newHash現在只是一個指向與$ User相同的數據的指針。這就是爲什麼當你更新一個,另一個也得到更新。 Mjolinor通過克隆$ User來完成正確的操作,而不是簡單地指向它。

在這裏看到:

What is the difference between a deep copy and a shallow copy?

1

.Clone()是一個正確的路徑,但它是有點危險,因爲一個克隆的哈希表其實並不時做同樣的事情作爲一個經常哈希表涉及到按鍵的大小寫敏感度。克隆的哈希表將複製數據,但並不是PowerShell哈希表默認情況下用來使鍵不區分大小寫的一點點信息。

幸運的是,你可以添加兩個哈希表一起在PowerShell中,它給你一個非常簡單的解決方法:

$NewHash = @{} + $User 
+0

你能提供一些關於這個或者一個例子的文檔嗎?我在第4版中沒有發現這是真的,但在早期版本中可能是這樣的? – crownedjitter