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.6  指定の文字列を含まないファイルは表示しない
■ ■

 Level.5では、指定のフォルダに格納されたテキストファイルの内容を検索し、結果をメッセージボックスに表示できました。ところが、ファイル中に検索文字列が含まれていない場合でも、空のメッセージボックスが表示されてしまいます。Level.6では、この余計なメッセージを表示させないように修正します。

検索文字列を含まないファイルはメッセージボックスを表示しない

 修正ポイントですが、まず検索がヒットしたらフラグに1をセットします。後は、メッセージボックスを表示する時に、フラグが1の時のみメッセージを表示するIf文を入れるだけです。簡単ですね。

 それでは、さっそくロジックを見てみましょう。

level06.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
Set fso = CreateObject("Scripting.FileSystemObject")
Set src = fso.GetFolder("C:\script\tips")    ' 対象フォルダの指定
Set regEx = New RegExp                       ' 文字列検索用オブジェクトの作成
srhStr = "ファイル"                          ' 検索文字列の指定

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 & 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
※ level5.vbsからの変更箇所(行追加や修正したところ)は行番号をオレンジにしました。

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

18〜26行目

018
019
020
021
022
023
024
025
026
        srhFlg = 0                                ' 検索ヒットフラグのクリア
        Do Until TextFile.AtEndOfStream
            tmpLine = TextFile.ReadLine             ' 1行読み込み

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

 19行目〜26行目のループは、前回までに説明した通り、1つのテキストファイルを1行づつ読みながら繰り返すループ処理です。Level.5で、21行目のIf文によって指定の文字列が含まれる時だけ、メッセージボックス表示用の変数(srhLine)にメッセージを追加していく処理を追加しましたので、このIf文の中(24行目)に、検索フラグに1をセットするもう1つ処理を追加しました。

 これで、ファイル読み込み処理が終わった後でも、該当ファイル中に検索文字列が含まれていたかどうかを判定することが可能になりました。

 それともう一つ大事な処理があります。ファイル読み込み処理の直前(18行目)にある、検索フラグのクリア処理です。複数のテキストファイルを扱いますので、1つ目のファイルに検索文字列が含まれていた場合、検索フラグのクリアを行わないと、2つ目以降のファイルでは検索文字列が含まれていようがいまいが、検索がヒット(フラグに1がセットされている)したように処理されてしまいます。

28〜30行目

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

 29行目で、検索結果が格納された変数(srhLine)を表示している訳ですが、28行目にIf文を追加し、検索がヒットしていた場合(srhFlgが1の時)だけ、処理を実行するように修正しました。

 今回の修正はこれだけです。

実行してみましょう

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

 ダブルクリックにて実行すると、表示されるメッセージは変わりませんが、OKをクリックして進めていくと、Level.5で空のメッセージボックスが表示されていたR23_004.txtとR23_005.txtが表示されなくなったのが分かると思います。

 今回はここまでです。次回のLevel.7では、メッセージにちょっと手を加えて、検索結果を若干見やすくしたいと思います。



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