[Powershell] ハッシュテーブルをfor文やforeach文を使って更新する方法

はじめに

ハッシュテーブルとは、配列によく似た構造で「キー」を使用して各値を設定します。

$ht = @{"Key1"="Value1"}

今回は、このハッシュテーブルの値をfor文やforeach文で回して更新する方法の備忘録となります。

OrderedDictionaryとしてハッシュテーブルを作成している場合

ハッシュテーブルでは「ordered」属性をつけることができます。この「ordered」属性を付与すると、この格納順序が保証されたハッシュテーブルとなります。

このようにordered属性をつけたハッシュテーブルをOrderedDictionaryと言います。

このOrderedDictionaryで作成すると「index」でアクセスすることができます。その場合はfor文を利用してデータを回して更新することができるようになります。

$ht = [ordered]@{
    "Key1"="Value1"
    "Key2"="Value2"
    "Key3"="Value3"
}

for($i = 0; $i -lt $ht.Keys.Count; $i++) {
   $ht[$i] = [string]::Format("{0}_{1}", $ht[$i], $i) 
}

上記を実行すると下記のような結果が得られます。

Name       Value                                                                            
----       -----                                                                            
Key1       Value1_0                                                                         
Key2       Value2_1                                                                         
Key3       Value3_2                                                                        

更新されていることがわかります。
このようにordered属性を付与することで、順番が保障されインデックスを利用してアクセスすることができるようになります。

foreachを使ってハッシュテーブルを更新する

ordered属性を使用していない場合にはforeach文を使って更新することができます。

ただし、foreachを利用する場合は、ハッシュテーブルをクローンするか、新しくハッシュテーブルを作成する必要があります。(新しく作る場合は更新というより新規ですね)

$ht = @{
    "Key1"="Value1"
    "Key2"="Value2"
    "Key3"="Value3"
}

foreach ($key in $ht.Clone().Keys) {
    $ht[$key] = "Value999"
}

結果は下記のとおりです。

Name       Value                                                                            
----       -----                                                                          
Key3       Value999                                                                           
Key1       Value999                                                                        
Key2       Value999 

もしordered属性を設定していた場合は、OrderedDictionaryにCloneメソッドが存在しないので、下記のようなエラーが発生します。

[System.Collections.Specialized.OrderedDictionary] に 'Clone' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。

また、クローンせずにそのままハッシュテーブルを使って更新しようとすると下記のようなエラーが発生します。

コレクションが変更されました。列挙操作は実行されない可能性があります。

Name       Value                                                                            
----       -----                                                                            
Key3       Value999                                                                           
Key1       Value1                                                                       
Key2       Value2

上記の通り一箇所のみが更新されエラーが発生して終了します。

最後に

ハッシュテーブルをループさせて更新させたい場合は[ordered]属性がついている場合と付いていない場合で方法が異なります。

是非参考にしてみてください。

タイトルとURLをコピーしました