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

PowerShell

【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

 

 

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

 

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りでマイペースな人です。

人気記事

1

こんにちは!SE ブログの相馬です。       今回は、PC に適用されている GPO を確認する方法について書きました。     グループポリシー ...

2

こんにちは!SE ブログの相馬です。       今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは ...

3

こんにちは!SE ブログの相馬です。       今回は、グループポリシーを使って、特定のコンピューターに対して、ドメインユーザーに Administrators 権限を ...

4

こんにちは!SE ブログの相馬です。       今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 ...

5

こんにちは!SEブログの相馬です。       今回は、ユーザープロファイルを削除する方法について書いてみました。     1 台の PC を複数人で ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!SE ブログの相馬です。       今回は、Windows Server 2016 で NTP サーバーと同期する方法について書きました。   & ...

-PowerShell
-