我在PowerShell中有一个哈希表,如下所示:
$table = @{
1 = 3;
2 = 3;
5 = 6;
10 = 12;
30 = 3
}
我需要用“4”替换所有“3”值。
抛出“Collection was modified”的异常:
$table.GetEnumerator() | ? {$_.Value -eq 3} | % { $table[$_.Key]=4 }
这会向对象添加另一个“Values”成员并将其分解:
$table.Values = $table.Values -replace 3,4
答案 0 :(得分:2)
迭代时不能修改表,所以首先进行迭代然后再进行更新。只需将您的管道分成两部分:
PS>$change = $table.GetEnumerator() | ? {$_.Value -eq 3}
PS>$change | % { $table[$_.Key]=4 }
PS>$table
Name Value
---- -----
30 4
10 12
5 6
2 4
1 4
答案 1 :(得分:0)
以上答案对我不起作用,我无法对此发表评论。上面的单行答案没有任何作用。我试图根据我的hashtable.Key aka Name将单个值更改为“ Off”。注意,我写$(backtick)的位置应该是字面的反引号,但它弄乱了代码块。这是从。\ BeepVariables.txt中提取的哈希表。
Name Value
---- ----
$varAwareCaseSound "On"
$varEmailSound "On"
function SetHash2([string]$keyword, [string]$value){
$hash = @{}
$hash = (get-content .\BeepVariables.txt).replace(";"," $(backtick) n") | ConvertFrom-StringData
@($hash.GetEnumerator()) | ?{$_.key -like "*$keyword*"} | %{$hash[$_.value]=$value}
$hash
}
SetHash2 "aware" '"Off"'