Tech-Ezo (Hokkaido PC and Network Users Group)
 Top Page  |  What's Tech-Ezo  |  Next Seminar  |  Seminar Log  |  Seminar Plan  |  Tips  |  life  |  Link  |
Scr.003 ステップアップ WSH - 使えそうなスクリプトを作って見よう
前ページへ   [ステップアップ WSHへ戻る]   次ページへ

  Session.2では、1つの(使えそうな)スクリプトを順を追って作成していきます。お題は『指定のフォルダ以下全てのテキストファイルの内容を検索する』です。

 『それだったら、Windowsの検索機能でできるじゃないか?』と思われる方も居るかもしれません。ところが、Windowsの検索機能にはバグがあり検索できない日本語があるのです(2004.3現在)。そんな馬鹿な、と思われる方は下記のサポート情報を参照して見てください。

 [NT]ANSI 以外の文字を使用した際 [含まれる文字列] で検索できない

 とはいえ、『使えるスクリプト』と言うにはいささか強引な理由付けではありますね。



■  Level.1  指定のフォルダに何が入っているか表示する
■ ■

 さてっ、まず最初にどこから手を着けましょうか?。私はまず「指定のフォルダ」に格納されたファイルを表示する部分からはじめることにしました。しかも「指定のフォルダ」は、今のところはスクリプト内に直に記述しておき、外部から指定できるロジックは後で考えることにしました。

準備

 早速スクリプトを作って行きたい所ですが、その前にちょっとテスト環境を準備しておきましょう。既に、階層化されたフォルダにテキストファイルが沢山格納された素敵な環境があれば、それをお使い頂いても結構ですが、適当なテスト環境が無い場合は、「ここ」をクリックして、アーカイブ(tips.lzh)をダウンロードしてください。ファイルは23KByte程度の小さなファイルですので、ブロードバンドじゃなくても大丈夫ですよ(笑。

 ダウンロードしたら解凍してスクリプト格納用に用意したフォルダ(ここでは、c:\script)に入れてください。フォルダの階層は下記のようになっていると思います。

テスト環境
c:\
└─script
    ├─-Hello.vbs
    │   ...
    └─-tips
           ├─linux
           │   ├─Lin001.txt
           │   ├─Lin002.txt
           │   └─Lin003.txt
           ├─script
           │   ├─Scr001.txt
           │   ├─Scr002.txt
           │   └─Scr003.txt
           ├─Windows
           │   ├─Win001.txt
           │   ├─Win002.txt
           │   └─Win003.txt
           ├─dummy.doc
           ├─dummy.xls
           ├─R23_001.txt
           ├─R23_002.txt
           ├─R23_003.txt
           ├─R23_004.txt
           └─R23_005.txt

 tipsフォルダ内のテキストの内容ですが、このWebサイト内にあるTipsの内容をw3m(テキスト型ブラウザ)でテキスト化し、ちょこちょこっと整形したものです。それと、内容が空の状態のWord文書(dummy.doc)と、Excelシート(dummy.xls)を入れてあります。

フォルダの内容表示

 さて、準備も出来たので早速スクリプトを作って見ましょう。

[level01.vbs]
001
002
003
004
005
006
007
008
009
010
011
012
Set fso = CreateObject("Scripting.FileSystemObject")
Set src = fso.GetFolder("C:\script\tips")    ' 対象フォルダの指定

' 指定のフォルダに格納された各ファイルを処理する
For Each FileName In src.Files
  WScript.Echo FileName
Next

' 指定のフォルダに格納された各サブフォルダを処理する
For Each FolderName In src.Subfolders
  WScript.Echo FolderName
Next

 最初ですので、1行1行見ていくことにしましょう。

1行目

001
Set fso = CreateObject("Scripting.FileSystemObject")

 1行目はFileSystemObject(ファイルシステムオブジェクト)の宣言です。VB系の言語や、C++などのオブジェクト指向言語を全くやったことのない人だと、いきなり投げ出したくなるような単語ですね(汗。まぁあまり理屈を考えずに、「意味は分からないけど単語をそのまま受け入れる」位の気軽な気持ちで進んで下さい。慣れてくると、気にならなくなりますので、しばらくの辛抱です。

 VBScriptという言語はシンプルな言語仕様なので、そのままでは大したことは出来ません。実はテキストファイル1つ読み込むことすら出来ないのです。そこで、色々な道具(オブジェクト)が必要になってきます。例えば、今使うFileSystemObject(ファイルシステム道具箱)は、各ドライブ(Cドライブとか、Dドライブなど)の使用容量や空き容量の報告、フォルダの中に格納された各種ファイルの報告、テキストファイルの読み込み等など...を行ってくれる道具箱(オブジェクト)です。

 オブジェクトは利用するに当たって名前を付けてあげる必要があります。現実世界ではあまりない習慣かもしれませんね。例えば、「裁縫セットに『そーちゃん』」とか「筆箱に『ふぅちゃん』」とか名前を付けてあげるわけです(笑。こうすると、同じ種類の道具箱が2つ以上あっても、それぞれを特定することができますね。

 ここでは、ファイルシステムオブジェクトに"fso"という名前を付けています。"File System Object"の略です。呼び名ですので、好きに決めてかまいません。お気に入りのニックネームを付けてあげましょう。最後になってしまいましたが、オブジェクトを宣言するときには、Set命令を使います。

2行目

002
Set src = fso.GetFolder("C:\script\tips")    ' 対象フォルダの指定

 2行目です。難しく言うと「FileSystemObjectのGetFolderメソッドを使って、C:\script\tipsフォルダのFolderオブジェクトを作成」しています(汗。(逃げないで下さいね...)

 また例え話しになりますが、裁縫セット(裁縫オブジェクト)の中には、針、糸、ハサミなどの道具が入っています。この道具をメソッドと言います。裁縫セットからハサミを使う場合、「Set 今使う糸 = そうちゃん.ハサミ(糸, 5cm)」のようになります。多少強引で、矛盾を感じるところもありますが、雰囲気を分かって頂けましたでしょうか?

 それにもう1つのポイントとして、「オブジェクトの中にオブジェクトがある」というものがあります。『お出かけセット(鞄)の中に、裁縫セットと筆箱が入っている』という状態です。ここでは、ファイルシステムオブジェクトの中にフォルダオブジェクトが入っている状態です。そして、フォルダオブジェクトを使う為に、ファイルシステムオブジェクトのGetFolderメソッドを使っています。やはりオブジェクトですから、名前を付ける必要があり、名前を付けるためにSet命令を使っています。

 本題に戻りまして、GetFolder("c:\script\tips")ではカッコ内に指定されたフォルダの各種情報を取得します。2行目ではその結果に、srcという名前を付けている訳です。

3行目〜4行目

003
004

' 指定のフォルダに格納された各ファイルを処理する

 3行目はプログラムを見やすくするために入れた空行で、4行目はコメント行です。シングルクォーテーション(')から行末までがコメントして実行時に無視されることになります。コメントはプログラムを読み易くするものですから、メモのつもりでなるべく入れるようにしましょう。

5行目〜7行目

005
006
007
For Each FileName In src.Files
  WScript.Echo FileName
Next

 5行目〜7行目は1セットですので纏めて説明します。まず、5行目のFor Eachは繰り返し処理用の命令です。繰り返しの範囲ですが、7行目のNextまでとなります。ここからがまた小難しい言葉が出現してしまうのですが、『For Eachは配列やコレクション内の各要素を1つづつ変数にセットしながら要素が無くなるまで繰り返します』。ここでは、Filesコレクションの要素について繰り返し処理を行っています。さて、問題の「コレクション」ですが、先程の例で行きますと、裁縫セット(オブジェクト)内のハサミ(メソッド)を使って、糸を10本切り出しました。この切り出した10本を纏めてコレクションと言います。ここではコレクションの要素は、1本1本の糸ですので、For Each文を使うと10回繰り返されることになります。

 繰り返されるときに、各要素は"For Each"の後に指定する変数に格納されます。上記のスクリプトでは"FileName"という名前の変数に格納されています。

 残りの6行目ですが、"WScript.Echo"はメッセージを画面に表示する命令です。cscriptではコマンドプロンプト内に表示され、wscriptではメッセージボックス内に表示されます。

 つまりこの3行では、c:\script\tips内の全てのファイル名を表示しているので、実行するとR23_001.txt〜R23_005.txtまでと、dummy.doc,dummy.xlsの7ファイルが表示されます。

8行目〜12行目

008
009
010
011
012

' 指定のフォルダに格納された各ファイルを処理する
For Each FolderName In src.Subfolders
  WScript.Echo FolderName
Next

 最後に、8行目〜12行目までを見てみましょう。8,9行目は3,4行目と同様空行とコメント行です。10〜12行は先程出てきたFor Each文によるループで、先程はファイルのコレクション(src.Files)でしたが、今度はサブフォルダのコレクション(src.Subfolders)でのループになっています。よって、実行するとC:\script\tips内にのサブフォルダである「Linux」「Script」「Windows」が表示されます。

実行してみましょう

 予定通りに動作するか実行してみましょう。下図のように表示されれば成功です。

C:\script>cscript level1.vbs
C:\script\tips\R23_001.txt
C:\script\tips\R23_002.txt
C:\script\tips\R23_003.txt
C:\script\tips\R23_004.txt
C:\script\tips\R23_005.txt
C:\script\tips\dummy.doc
C:\script\tips\dummy.xls
C:\script\tips\Linux
C:\script\tips\Script
C:\script\tips\Windows
C:\script>

 さて、準備の説明や1行毎の解説を入れたので少々長くなってしまいましたが、ご理解頂けたでしょうか?。この後、この12行のスクリプトをちょっとずつ改変して行きながら、目的のスクリプトまでたどり着きたいと思います。



前ページへ   [ステップアップ WSHへ戻る]   次ページへ
-
※全ては自己責任でお願いします。
※当サイトに関するご連絡は tomomo_c@hotmail.com までお願いします。
最終更新日 2004.3.16