我有以下脚本不被枚举对象时:错误修改
$serverList = @{
"Server1Name" = @{ "WindowsService1" = "Status"; "WindowsService2" = "Status" };
"Server2Name" = @{ "WindowsService1" = "Status"; "WindowsService2" = "Status" };
"Server3Name" = @{ "WindowsService1" = "Status" };
"Server4Name" = @{ "WindowsService1" = "Status" };
"Server5Name" = @{ "WindowsService1" = "Status" };
"Server6Name" = @{ "WindowsService1" = "Status" }
}
$copy = $serverList.Clone()
foreach ($server in $copy.Keys) {
foreach ($service in $copy[$server].Keys) {
$serviceInfo = Get-Service -ComputerName $server -Name $service
$serverList[$server][$service] = $serviceInfo.Status
}
}
我确信,我没有修改被列举的哈希表,但是当我运行但我仍然得到这个错误剧本:
Collection was modified; enumeration operation may not execute.At line:14 char:14
+ foreach ($service in $copy[$server].Keys) {
+ ~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], InvalidOperationException
+ FullyQualifiedErrorId : System.InvalidOperationException
我在这里读到:http://blog.matticus.net/2013/11/powershell-clearing-values-within.html。如果我在那里复制代码表单,它对我来说执行没有错误。
我的问题可能与嵌套的foreach循环有关吗?我的代码中有错误吗?任何人都可以对此有所了解吗?
哇,漂亮的答案,以取代线
。像魅力一样工作。 –
感谢您的解决方法。仅仅是我,还是这是PowerShell的一个坏主题?我希望它克隆整个对象,而不仅仅是它的一部分...... –
不,这是底层框架处理集合的方式所固有的。你会在.Net中遇到同样的问题(实际上,我更像是一个C#人,但我知道PowerShell的工作原理是一样的)。天真地说,你并没有改变“Keys”属性,所以它应该没问题。但是,.Keys可能是对KeyValue对象的迭代,并且您正在更改KeyValueObject.Value - 并且框架因此认为您已修改了正在迭代的集合。 – Tewr