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へ戻る]   次ページへ


■  Level.8  検索対象フォルダと検索文字列を入力できるようにする
■ ■

 結構使えるレベルになってきましたが、Level.7の状態だと、検索対象フォルダの指定や検索文字列の指定がスクリプトの中にあり、変更するにはいちいちスクリプトを書き換えなければならない状態で使い難いですね。

 そこで、Level.8ではスクリプトの起動後、メッセージボックスを表示し、そこに検索対象フォルダや検索文字列を指定できるようにします。

メッセージボックスを利用して情報を入力する

 今回の修正ポイントは、InputBox関数を使い必要な情報をメッセージボックスから得るようにします。勉強会では、検索対象フォルダと、検索文字列の入力で2行しか修正しなかったのですが、ここではさらに、入力された検索対象フォルダが存在するかチェックする機能も追加します。

level08.vbs
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
042
043
044
045
046
047
048
049
050
051
Set fso = CreateObject("Scripting.FileSystemObject")
srhFol = ""
Do Until fso.FolderExists(srhFol)  ' 存在するフォルダ名が入力されるまで繰り返す
    tmpMsg = "検索フォルダを入力して下さい" & vbNewLine & _
             "終了時は""c""と入力して下さい。"
    srhFol = InputBox(tmpMsg,,"C:\script\tips") ' 対象フォルダの指定
    If LCase(srhFol) = "c" Then     ' cが入力されたらスクリプトを終了する
        WScript.Quit
    End If
Loop
Set src = fso.GetFolder(srhFol)               ' 対象フォルダの指定
Set regEx = New RegExp                        ' 文字列検索用オブジェクトの作成
srhStr = InputBox("検索文字を入力して下さい",,"ファイル") ' 検索文字列の指定

regEx.Pattern = srhStr                        ' 検索文字列を検索パターンとして指定
regEx.Global = True                           ' 文字列全体を検索するように指定
regEx.IgnoreCase = True                       ' 大文字・小文字は検索に影響しない

' 指定のフォルダに格納された各ファイルを処理する
For Each FileName In src.Files
    FileEx = fso.GetExtensionName(FileName)   ' ファイル名から拡張子を抜き出す
    If LCase(FileEx) = "txt" Then             ' 拡張子を小文字化してから比較

      ' テキストファイルの内容読み込み処理
        Set TextFile = fso.OpenTextFile(FileName) ' テキストファイルのオープン
        srhLine = FileName & ":" & vbNewLine      ' 検索結果格納用変数の初期化
        srhFlg = 0                                ' 検索ヒットフラグのクリア
        Do Until TextFile.AtEndOfStream
            tmpLine = TextFile.ReadLine             ' 1行読み込み

            If regEx.Test(tmpLine) Then                 ' 指定の文字列を含むか?
                srhLine = srhLine & TextFile.Line - 1 & ":" & tmpLine & vbNewLine
                                                        ' 読み込んだ行のマージ
                srhFlg =1                               ' 検索がヒットしたので1にする
            End If
        Loop

        If srhFlg = 1 Then                              ' 指定の文字列が含まれてたら
            WScript.Echo srhLine
        End If

    End If
Next

' 指定のフォルダに格納された各サブフォルダを処理する
tmpMessage = "フォルダ一覧:" & vbNewLine
For Each FolderName In src.Subfolders
    tmpMessage = tmpMessage & FolderName & vbNewLine
Next
WScript.Echo tmpMessage
※ level7.vbsからの変更箇所(行追加や修正したところ)は行番号をオレンジにしました。

 それでは変更ポイントを見てみましょう。前回までと同様、見易さの為に入れた空行やコメントの説明は省きます。

3〜11行目

002
003
004
005
006
007
008
009
010
011
srhFol = ""
Do Until fso.FolderExists(srhFol)  ' 存在するフォルダ名が入力されるまで繰り返す
    tmpMsg = "検索フォルダを入力して下さい" & vbNewLine & _
             "終了時は""c""と入力して下さい。"
    srhFol = InputBox(tmpMsg,,"C:\script\tips") ' 対象フォルダの指定
    If LCase(srhFol) = "c" Then     ' cが入力されたらスクリプトを終了する
        WScript.Quit
    End If
Loop
Set src = fso.GetFolder(srhFol)               ' 対象フォルダの指定

 この部分では、検索対象となるフォルダ名の入力を行っています。Level.7では、11行目のGetFolderメソッドのみでしたが、Level.8ではこの部分をメッセージボックスからの入力およびフォルダの存在チェックを追加しています。それでは、1つ1つ見ていきましょう。

 2行目では、フォルダ名を格納する変数(srhFol)を初期化しています。

 3行目〜10行目の繰り返し処理(Do〜Loop)は、フォルダ名入力処理となっています。このループは、3行目にある条件によって、正しいフォルダ名が入力されるまで繰り返し処理されます。『正しいフォルダ名』は、3行目の"fso.FolderExists(srhFol)"メソッドにより、入力されたフォルダ名(srhFol)が実在する場合「真(正しい)」と判断されます。

 4行目〜5行目では、メッセージボックスを表示するときに、その中に表示するメッセージをtmpMsg変数に作成しています。内容は1行目に「検索フォルダを入力して下さい。」、2行目に「終了時は"c"をと入力して下さい。」と表示します。ところで、4行目の末尾にアンダースコア(_)がありますが、これは、行の『継続』を意味していて「4行目と5行目を合わせて1行として扱って下さい」という指示です。行の継続は1文が長い時に見易さの為に使用します。

 6行目では、InputBox関数を使ってメッセージボックスを表示しています。メッセージボックスの中には、先程作成したメッセージ(tmpMsg)と、入力用のテキストボックスが表示されます。また、テスト時に何度も「C:\script\tips」と入力するのが面倒なので、初期値として指定して見ました。不要な場合は、InputBox関数の第3パラメタから削除して下さい。

 7行目〜9行目は、フォルダ名入力の繰り返し処理で「やっぱ、やぁ〜めたっ」と思った時に、処理を終了できるようにしています。終了条件はフォルダ名に"c"か"C"と入力された場合に終了します。LCase関数は括弧内のアルファベットを全て小文字化する関数です。よって、If文では"c"のみを判定しています。また、スクリプトの終了はWScript.Quitによって行っています。

 最後に11行目ですが、これは以前までのレベルと同様、GetFolderメソッドを使ってフォルダのオブジェクトを作成しているのですが、以前は"C:\script\tips"と定数(固定値)を使っていたのに対し、今回は10行目までにフォルダ名がセットされたsrhFol変数を指定しています。

13行目

013
srhStr = InputBox("検索文字を入力して下さい",,"ファイル") ' 検索文字列の指定

 13行目は先程のフォルダ名の入力同様、InputBox関数を使い検索文字列を入力しています。また、テスト時に何度も検索文字列を入力するのが面倒なので、初期値として"ファイル"を入力してあります。

実行してみましょう

 さて、早速実行してみましょう。

level8.vbsファイルをダブルクリックして実行
最初は、フォルダ名の入力を求められる...
次に、検索文字の入力を求められる...
後はLevel.7までと同様検索結果が表示されていく...

 と、こんな感じになります。これでいちいちスクリプトを修正しなくても検索対象フォルダや、検索文字の指定ができるようになりました。

 さて、今回はここまでです...が、ふとこのスクリプトを見ていて私自身不満があることに気が付きました。勉強会では、この後のレベルで入力インタフェースの改善をしていく方向でしたのでこのまま進めるのが良かったのですが、実際にこのスクリプトを使って検索することを考えると、バッチ処理的に使う時には、いちいちダイヤログボックスが出てきしまったのでは使い物になりませんね(汗。

 そこで、この後の2回、つまりLevel.10で一端スクリプトが完成した状態になりますので、おまけ的にLevel.10aとでもしてコマンドラインのオプション指定でフォルダと検索文字を指定できるバージョンを作りたいと思います。

 ちなみに、次のLevel.9では今まで見て見ない振りをしてきた(笑)、サブフォルダの内容までを検索対象にしたいと思います。勉強会では、分かり易くなるように多少遠回りして見たのですが、かえって分かり難いものになってしまった気がしますので、ちょっと内容を変えて見ようと思っています。



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