正在从循环外部的第二个哈希表中删除PowerShell哈希表值

正在从循环外部的第二个哈希表中删除PowerShell哈希表值,powershell,hashtable,powershell-5.0,Powershell,Hashtable,Powershell 5.0,我肯定这个标题不是很清楚,为此我道歉。我在写一个脚本时遇到了一些问题,我希望能得到一些帮助,弄清楚到底发生了什么。我找到了解决问题的方法,我更想知道为什么会发生这种情况。脚本超过3k行,但我在下面写的代码片段复制了相同的问题 我有三个哈希表,DeviceList,AllDevices和RemovedDevices。恶魔主义者被明确地列出,所有的设备都等于恶魔主义者。在循环中,RemovedDevices中存在的项将从DeviceList中删除。尽管本示例中仅在开头修改了所有设备,但仍将从中删除这

我肯定这个标题不是很清楚,为此我道歉。我在写一个脚本时遇到了一些问题,我希望能得到一些帮助,弄清楚到底发生了什么。我找到了解决问题的方法,我更想知道为什么会发生这种情况。脚本超过3k行,但我在下面写的代码片段复制了相同的问题

我有三个哈希表,DeviceList,AllDevices和RemovedDevices。恶魔主义者被明确地列出,所有的设备都等于恶魔主义者。在循环中,RemovedDevices中存在的项将从DeviceList中删除。尽管本示例中仅在开头修改了所有设备,但仍将从中删除这些设备

$DeviceList = @{"server1" = "email1"; "server2" = "email2"; "server3" = "email3"}
$AllDevices = $DeviceList
$RemovedDevices = @{"server1" = "email1"; "server2" = "email2"}

foreach($RemovedDevice in $RemovedDevices.GetEnumerator())
  {
  $DeviceList | where {$_.ContainsKey($RemovedDevice.Key)} | % {$_.Remove($RemovedDevice.Key)}
  }
$AllDevices
运行上述文本时,$AllDevices被修改为仅包含server3信息,其中它仍应包含所有3台服务器

如果我将第二行修改为:

$AllDevices += $DeviceList
然后所有设备维护所有3个值。在第一个版本中使用断点和单步执行,我已经验证了在第一次之后没有命中所有设备

我的总体问题是:为什么在循环完成后,所有设备都被修改为相等的DeviceList?如果它在开始时只被调用一次,那么它的值不应该在修改了DeviceList之后保持不变吗?使用类似的方法重建数组不会覆盖所有设备,所以我认为这是一个哈希表的怪癖

PSVersion 5.0.10586.117

为什么循环完成后,所有设备都被修改为相等的DeviceList

因为$AllDevices只是对与$DeviceList相同的底层对象的引用

如果它在开始时只被调用一次,那么它的值不应该在修改了DeviceList之后保持不变吗

如果$AllDevices是一个相同的对象,当然,但它不仅仅是相同的,而是相同的对象

幸运的是,哈希表实现了IClonable接口,因此对于浅层哈希表,您可以使用Clone方法:


我发现hashtable与Where对象的用法超级不可读,更不用说速度太慢了,但从功能上讲,上面的内容与您原来的foreach循环体是一样的

,我从来不知道这样做只是一个引用,而不是一个单独的对象。非常感谢您的解释!
$DeviceList = @{"server1" = "email1"; "server2" = "email2"; "server3" = "email3"}
$AllDevices = $DeviceList.Clone()

$RemovedDevices = @{"server1" = "email1"; "server2" = "email2"}

foreach($RemovedDevice in $RemovedDevices.GetEnumerator())
{
    if($DeviceList.ContainsKey($RemovedDevice.Key))
    {
        $DeviceList.Remove($RemovedDevice.Key)
    }
}
$AllDevices