| 基礎解説 チェック式 WSH入門 第19回 2.Dictionaryオブジェクト Microsoft MVPData Center Management - PowerShell 牟田口 大介 2009/07/29 |
![]() |
|
Page1
Page2
|
|
FileSystemObjectが含まれるMicrosoft Scripting Runtimeライブラリには、今回取り上げたTextStreamオブジェクトなど、いくつかのオブジェクトが存在する。これまでのオブジェクトはすべてFileSystemObjectオブジェクトをCreateObjectして、そこからたどり着くことができたが、1つだけたどり着けないオブジェクトが存在する。それがDictionaryオブジェクトである。DictionaryオブジェクトはProgIDが“Scripting.Dictionary”であり、これだけは直接CreateObjectして作成する。
さて、Dictionaryオブジェクトであるが、これはほかのプログラミング言語やスクリプト言語でいうところの連想配列(ハッシュ)と同等のものである。連想配列とは、(重複しない)一意なキーと、それに対応する値を持つ、配列の一種である。キーや値には任意のデータ型を用いることができる。連想配列はキーを検索するのが速いという特長がある。ただし、キーの格納順序については保証されない。例えば要素を列挙した際、最後に追加した要素が最後に現れるかどうかは分からない。
最も簡単な連想配列を作成し、キーと値を読み書きする例をお見せしよう。
※ファイル:DictionaryTest.vbs |
このスクリプトを実行すると、次のようなダイアログが連続して表示される。
| 1.キーの値の表示 |
![]() |
| 2.キーの存在の確認 |
![]() |
| 3.Dictionaryに含まれる要素数 |
![]() |
| 4.キーに含まれる値の列挙 |
![]() |
| DictionaryTest.vbsの実行結果 |
このスクリプトでは、まず連想配列(Dictionaryオブジェクト)を作成している。次にAddメソッドを使って文字列型のキーと値を追加している。ここでは「kona」などがキー、「Konata Izumi」などが値である。あるキーに含まれる値を参照するには、Itemプロパティ(既定プロパティなので省略可)でキーを引数に与えることで可能である。すなわち、objDictionary("kaga")のようにする。キーが存在するかどうかはExistsメソッドを用いて調べる。存在するとTrue、存在しなければFalseを返す。要素の数はCountプロパティで取得できる。ところで、連想配列はすでに存在するキーを追加しようとするとエラーになるので、キーが重複する可能性がある場合は、
If Not objDictionary.Exists("misa") Then |
のようにキーの存在を確認して、ない場合は追加する(逆に存在する場合は特別な処理をするなど)、ということをする場合がよくあるので覚えておいてもらいたい。
キーの一覧はKeysプロパティで取得できる。これはキーの一覧が1次元配列として格納されているので、For 〜 Each 〜 Nextステートメントで列挙できる。値の一覧もItemsプロパティで取得できるので覚えておくとよいだろう。これらのキーに対応する値を取得して、最終的にまとめて表示している。最後にRemoveAllメソッドを呼び出し、連想配列を空にしている。なお、Removeメソッドを用いると、特定のキーのみ削除することも可能である。
連想配列が一意のキーのみを持ち自由に追加、削除ができるということを利用すると、可変長の配列として便利に利用することもできる。その場合、キーに実際に使用する値を指定し、キーに対する値は0や "" (長さ0の文字列)などを格納しておけばよいだろう(ただし、重複する値があり得るデータに対してはこの方法は使えない)。
ほかにもDictionaryオブジェクトの特性を用いた便利な使い方もある。それをDictionaryオブジェクトの使い方の復習を兼ねた例題としてみよう。
あるテキスト・ファイル(ここでは引き続きデスクトップのtest.txtを用いる)を開き、そこに含まれる文字数(出現回数)を文字ごとにカウントする例を考えてみよう。ただし2回以上出てきた文字だけを表示することにする。例えば「あ」が2回、「え」が3回、……などと表示させる。これはDictionaryオブジェクトを用いると比較的容易に行える。
※ファイル:CountCharacters.vbs
On Error Goto 0
'値を+1する
Else 'もし連想配列に存在しなければ
End If
'文字数が1より多ければ、strMessageに「文字: 回数」を追加
|
このスクリプトを実行すると、例えば次のようになるだろう。
![]() |
| CountCharacters.vbsの実行例 |
| test.txtに含まれる「文字: 回数」が表示されている。1回しか出現していない文字は表示されないので、回数はすべて2以上になっている。 |
このスクリプトでは、まずstrContentという変数にtest.txtの中身をすべて読み出している。この際、TextStreamオブジェクトを変数で受けず、そのままReadAllメソッドを呼び、コード記述量を減らしているのがポイントである。
続いて、読み出した文字列から、Mid関数とForループを用いて1文字ずつ切り出している。切り出した文字が連想配列に含まれていなければ新しく追加し、値に1を格納する。これはその文字が1文字あるという意味である。もし切り出した文字が連想配列に含まれていれば、そのキーに対応する値を+1する。これを繰り返すことで、文字ごとの出現回数がカウントできることが分かるだろう。
■
今回はTextStreamオブジェクトを用いたテキスト・ファイルの読み書きと、Dictionaryオブジェクトを用いた連想配列の取り扱い方について述べた。
さて、このWSH連載は今回が最終回である。本連載ではVBScriptの文法からWSHの基本機能まで一通り解説したが、お役に立てたであろうか。
WSHは連載開始当初はWindows XP/Windows Server 2003版のVer.5.6が最新であったが、その後もマイナー・バージョンアップが続けられ、Windows Vista/Windows Server 2008にはVer.5.7が、Windows 7/Windows Server 2008 R2にはVer.5.8が搭載されている。Windows XPもパッチを当てることでVer. 5.7が適用される。今後Windowsのスクリプト実行環境のメインストリームはPowerShellに移行していくが、「お手軽」で、「どこででも動く」WSHはこれからもまだまだ使われるはずである。また、WSHに含まれるオブジェクト(WshShellオブジェクトなど)はPowerShellからも利用価値が高いものである。ぜひ、本連載やスクリプト・センターなどを参考にして、WSHをPCやサーバの管理に役立ててもらいたい。
途中、休載期間をいただいたが3年にわたる長期連載となった。長い間、この連載をご愛読いただき、ありがとうございました。![]()
| INDEX | ||
| [基礎解説]チェック式 WSH入門 | ||
| 第19回 TextStreamオブジェクトとDictionaryオブジェクトを使う [最終回] | ||
| 1.TextStreamオブジェクト | ||
| 2.Dictionaryオブジェクト | ||
| 基礎解説 |
TechTargetジャパン
- フォルダの名前が変更できない不具合を解消する (2012/5/25)
Windows 7のエクスプローラで画像ファイルやPDFが含まれるフォルダの名前が変更できなかったり、削除できなかったりする不具合の解消方法を解説する - 通信相手のMACアドレスを調べる近隣探索プロトコル (2012/5/24)
イーサネットで通信する場合、相手のMACアドレスが分からないとパケットを送信できない。ARPに代わるIPv6の近隣探索機能とは? - 第316話 ネット対応トイレ (2012/5/22)
毎日用をたすだけで、体温に体重、血圧、体脂肪率も計測して、尿検査、便検査も自動で実施、データはネット経由で医師に送られます - 私物のスマートフォンを業務に活用、「BYOD」って何? (2012/5/21)
私物のスマホやノートPCを組織的に業務に活用する「BYOD」が新たなトレンドとして注目されている。なぜいまBYODなのか? BYODのメリットとデメリットは?
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -






