我有以下腳本不被枚舉對象時:錯誤修改
$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