Powershell Hashtable添加/删除方法会影响所有变量。

时间:2013-11-01 17:07:04

标签: powershell methods 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 个答案:

答案 0 :(得分:3)

试试这个:

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

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

答案 1 :(得分:1)

我认为指出这不是奇怪的行为很重要,但实际上是设计上的。当你说

$newHash = $User

您正在制作$ User的浅层副本,现在$ newHash和$ User都指向相同的内存空间。换句话说,$ newHash现在只是指向与$ User相同数据的指针。这就是为什么当你更新一个,另一个也得到更新。 Mjolinor通过克隆$ User而不是简单地指向它来以正确的方式完成它。

见这里:

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

答案 2 :(得分:1)

.Clone()是一个正确的路径,但它有点危险,因为当涉及到区分大小写时,克隆的哈希表实际上并不像常规哈希表那样做。克隆的哈希表将复制数据,但不会删除PowerShell哈希表在默认情况下使密钥区分大小写的一小部分信息。

幸运的是,您可以在PowerShell中添加两个哈希表,这为您提供了一个非常简单的解决方法:

$NewHash = @{} + $User