这是我一直试图克服的一些奇怪的例子,最终的结果是我想要一个带有组合哈希表的新变量,但是没有修改两个原始哈希表。
示例:我有两个哈希表。
$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中删除它!我似乎无法绕过这种行为,建议非常感谢!
答案 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