替换PowerShell中哈希表中的值

时间:2014-02-04 11:41:15

标签: powershell

我在PowerShell中有一个哈希表,如下所示:

$table = @{
     1 =  3;
     2 =  3;
     5 =  6;
    10 = 12;
    30 =  3
}

我需要用“4”替换所有“3”值。

  1. 有没有一种漂亮而干净的方法可以不重复每一对并将每一对写入新的哈希表?
  2. 如果我使用其他.NET集合类,可以更轻松地完成具有相同数据的操作吗?
  3. 抛出“Collection was modified”的异常:

    $table.GetEnumerator() | ? {$_.Value -eq 3} | % { $table[$_.Key]=4 }
    

    这会向对象添加另一个“Values”成员并将其分解:

    $table.Values = $table.Values -replace 3,4
    

2 个答案:

答案 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"'