SEブログ

【PowerShell】連想配列(hash_table)についてまとめ

 

こんにちは!

 

 

連想配列について書いてみました。

 

 

連想配列の概要

 

 

配列のキー(インデックス)が文字列となったものを連想配列といいます。

(配列を未だ知らない方は以下の記事を見て頂けますと幸いです。)

 

 

【PowerShell】配列についてまとめてみる

 

 

前の記事で配列を作成した時に、キー(インデックス)は 0 から順に振りました。

 

 

配列のインデックスと値について(上の太枠がインデックスで下が値になります。)

 

 

 

連想配列ではそのキーを文字列としています。

配列と連想配列について、基本的な考え方は同じだと思います。

キーが数値のものを配列で、文字列のものを連想配列という事(考え方)になります。

 

 

それでは、どんな風に使うのか、イメージとして例を作成しました。

ここでは、住所と郵便番号が連想配列になっています。

東京都港区がキー (Key) で、105-0000 が値 (Value) になります。

 

 

 

 

では、このイメージをもとに PowerShell で書いてみましょう。

 

 

連想配列の構文

 

 

連想配列の構文は以下のようになります。

キーと値を関連付ける為に =(イコール)を使用します。

 

$hash = @{
    "key1" = "key1 value"
    "key2" = "key2 value"
    "key3" = "key3 value"
    "key4" = "key4 value"
    "key5" = "key5 value"
}

 

 

サンプルコード

 

 

では、先ほどの郵便番号に置き換えてみます。

 

$address_book = @{
    "東京都港区"     = "105-0000"
    "東京都中央区"   = "105-0000"
    "東京都品川区"   = "140-0000"
    "東京都千代田区" = "100-0000" 
    "東京都新宿区"   = "160-0000"
}

$address_book


# 実行結果


$address_book

Name Value 
---- ----- 
東京都千代田区 100-0000 
東京都品川区 140-0000 
東京都港区 105-0000 
東京都中央区 105-0000 
東京都新宿区 160-0000

 

 

これで、連想配列を作る事ができました。

 

 

連想配列のメソッド・プロパティ

 

 

それでは、連想配列に対してどんなメソッドやプロパティがあるのか見てみたいと思います。

例えばメソッドだと連想配列に追加 (Add)したり、数を数えたりする (count) 事ができ、またプロパティだと連想配列内にキーと値を追加する (IsFixedSize) 事ができるかなどが確認できます。

 

$address_book | Get-Member


# 実行結果

TypeName: System.Collections.Hashtable

Name MemberType Definition 
---- ---------- ---------- 
Add Method void Add(System.Object key, System.O...
Clear Method void Clear(), void IDictionary.Clear() 
Clone Method System.Object Clone(), System.Object...
Contains Method bool Contains(System.Object key), bo...
ContainsKey Method bool ContainsKey(System.Object key) 
ContainsValue Method bool ContainsValue(System.Object value)
CopyTo Method void CopyTo(array array, int arrayIn...
Equals Method bool Equals(System.Object obj) 
GetEnumerator Method System.Collections.IDictionaryEnumer...
GetHashCode Method int GetHashCode() 
GetObjectData Method void GetObjectData(System.Runtime.Se...
GetType Method type GetType() 
OnDeserialization Method void OnDeserialization(System.Object...
Remove Method void Remove(System.Object key), void...
ToString Method string ToString() 
Item ParameterizedProperty System.Object Item(System.Object key...
Count Property int Count {get;} 
IsFixedSize Property bool IsFixedSize {get;} 
IsReadOnly Property bool IsReadOnly {get;} 
IsSynchronized Property bool IsSynchronized {get;} 
Keys Property System.Collections.ICollection Keys ...
SyncRoot Property System.Object SyncRoot {get;} 
Values Property System.Collections.ICollection Value...

 

 

数を数えたい時は count メソッドが使えます。

 

$address_book.count


# 実行結果

5

 

 

連想配列からキーのみ取り出したい場合は keys メソッドが使えます。

 

$address_book.keys


# 実行結果

東京都千代田区
東京都品川区
東京都港区
東京都中央区
東京都新宿区

 

 

また、値を取り出したい場合は values メソッドが使えます。

 

$address_book.values


# 実行結果

100-0000
140-0000
105-0000
105-0000
160-0000

 

 

それでは特定のキーに対する値を取り出したい場合はどんな風に書くでしょうか。

簡単で、キーの名前を文字列で “(ダブルクォーテーション)で囲い、直接書けばいいだけです。

 

$address_book."東京都新宿区"


# 実行結果

160-0000

 

 

配列ではできませんでしたが、連想配列内にキーと値を追加する事ができるか確認してみます。

返り値は False ですので、連想配列は Fix(固定)ではない。という事になります。

 

$address_book.IsFixedSize


# 実行結果

False

 

 

固定ではないのであれば、早速追加してみましょう。

東京都渋谷区を追加してみます。

 

$address_book.Add("東京都渋谷区", "150-0000")
$address_book


# 実行結果

Name Value 
---- ----- 
東京都千代田区 100-0000 
東京都品川区 140-0000 
東京都港区 105-0000 
東京都新宿区 160-0000 
東京都中央区 105-0000 
東京都渋谷区 150-0000 ← 追加されました。

 

 

表示結果でキーの表示を並び替えたい場合は、以下のように書きます。

(郵便番号ではわかりにくいので、内容をサーバーに変更しました。)

 


[hashtable]$server_data = [ordered]@{
"ip_192.168.100.101" = "server1"
"ip_192.168.100.103" = "server3"
"ip_192.168.100.102" = "server2"
}

$server_data


# 実行結果(server2 と server3 の表示の並びが入れ替わっています。)

Name Value 
---- ----- 
ip_192.168.100.101 server1 
ip_192.168.100.102 server2
ip_192.168.100.103 server3

 

 

最後に、こんな風に書くこともできます。キーに対して、複数の値を指定する事ができます。

 

$server_data = @{
    "Active Directory"   = @{"OS" = "Windows Server"; "Version" = "2016"};
    "Application Server"  = @{"OS" = "Redhat Linux"; "Version" = "7.2"};
    "Web Server" = @{"OS" = "CentOS"; "Version" = "6.5"};
}

$server_data["Active Directory"];


# 実行結果

Name Value 
---- ----- 
OS Windows Server 
Version 2016

 

 

いかがでしょうか。連想配列が使えるようになってくると書ける処理内容がより高度になってくるかと思います。

 

では最後までお読みいただきありがとうございました!