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.5  指定の文字列を含む行だけを表示する
■ ■

 Level.4では、読み込んだテキストファイルの内容を、全て1つのメッセージボックスに詰め込んで表示してみました。Level.5では、いよいよ検索機能を付加し、指定の文字列を含む行だけを表示させるように修正してみます。また、「ファイル一覧表示」の機能は不要なのでこれも取り払います。

テキストファイルを読み込んで検索文字列を含む行のみを表示する

 まずスクリプトの流れを説明しますと、ファイル名ループで取得した一つ一つのテキストファイルについて、その内容を全部読み込み、連結して、1つのメッセージボックスの中に表示します。これを、ファイル数分繰り返し、最後にLevel.3までと同様に、ファイル名一覧とフォルダ一覧を表示する、という流れになっています。

level05.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
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      ' 検索結果格納用変数の初期化
        Do Until TextFile.AtEndOfStream
            tmpLine = TextFile.ReadLine             ' 1行読み込み

            If regEx.Test(tmpLine) Then                 ' 指定の文字列を含むか?
                srhLine = srhLine & tmpLine & vbNewLine ' 読み込んだ行のマージ
            End If
        Loop
        WScript.Echo srhLine

    End If
Next

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

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

3行目

011
Set regEx = New RegExp                       ' 文字列検索用オブジェクトの作成

 文字列検索用のオブジェクト"RegExp"を作成しています。RegExpは単なる検索機能ばかりではなく、正規表現を用いた検索や、文字列置換などの機能を提供してくれます。

 ところで"正規表現"って何でしょうか?。正規表現は、いわゆる「メタ文字」「マスク」などと言われる、特殊な意味を持った文字を使った検索文字列の指定方法です。例えば、この後の行で、「ファイル」という文字列を検索していますが、「^ファイル」とすることで行の先頭に「ファイル」という文字列が出現する行のみを表示することが可能です。ちなみに、用意してあるテキストファイル無いには「ファイル」から始まる行はありません。実験するならば、「スクリプト」「^スクリプト」などとして検索してみましょう。

 正規表現について簡単に表に纏めてみました、これ以外にもありますので一度ドキュメントを眺めて見て下さい。

正規表現の例
文字 内容
^ 行頭で見つける ^file ... "file"から始まっている行
$ 行末で見つける file$ ... "file"で終わっている行
* 直前の文字の0回以上の繰り返し go*gle ... ggle, gogle, google などにヒット
+ 直前の文字の1回以上の繰り返し go+gle ... gogle, google, gooogle などにヒット
? 直前の文字の0または1回の繰り返し go?gle ... ggle, gogle
{n} 直前の文字の丁度n回の繰り返し go{2}gle ... googleにヒット
{n,} 直前の文字の少なくてもn回の繰り返し go{2,}gle ... google, gooogle, goooogle などにヒット
{n,m} 直前の文字のn〜m回の繰り返し go{2,3}gle ... google, gooogle にヒット
. 改行以外の任意の文字 .at ... cat, hat, rat などにヒット
xxx|yyy xxxかyyyにヒット (cat|dog) park ... cat park, dog park にヒット
[abc] aかbかcにヒット,"-"で範囲指定も可能 [A-Z][a-z]* ... The, Internet などにヒット
[^abc] a,b,cに以外の文字にヒット,"-"で範囲指定も可能 [^0-9]* ... 数字を含まない文字列にヒット

4行目

004
srhStr = "ファイル"                          ' 検索文字列の指定

 検索文字列を変数(srhStr)に入れています。最初は文字列"ファイル"を含む行を表示することにしますが、この値を適当に変えることで、検索文字列が変化します。

6行目〜8行目

 6〜8行目では、実際に検索する前に、RegExpオブジェクトに対してちょっとした指示をしています。

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

 6行目のPatternプロパティでは、先程srhStrに格納した検索文字列を、RegExpオブジェクトに渡しています。

 7行目のGlobalプロパティは、検索対象(ここではテキストファイル中の1行)に複数の検索文字列が含まれているときの、動作を指定しています。"True"は全体を検索し、"False"にすると最初に見つけたら検索をやめます。つまり、1行中に2つヒットする文字列があっても、後ろの方は無視するわけです。Level.5ではどちらを指定しても結果は変わりませんが、後々の修正を考えて"True"(全体を検索)を指定しています。

 8行目のIgnoreCaseでは、アルファベットの大文字・小文字の扱いを指示しています。今回は、日本語を検索文字列としているので関係ありませんが、検索文字列にアルファベットを指定した時に、このオプションが影響します。"True"は大文字・小文字を気にしません(無視します)、"False"にすると大文字・小文字は違う文字として扱われます。

19行目〜21行目

021
022
023
            If regEx.Test(tmpLine) Then                 ' 指定の文字列を含むか?
                srhLine = srhLine & tmpLine & vbNewLine ' 読み込んだ行のマージ
            End If

 Level.4と同じく18行目〜24行目がテキストファイルを1行目から最後の行まで読み込んでいる繰り返し処理になります。Level.4では、読み込んだ行(tmpLine)を無条件にメッセージ表示用の変数(srhLine)にくっ付けていましたが、Level.5では21行目のIf文で、指定の文字列(ここでは「ファイル」)を含む場合だけ、srhLineに該当行をくっ付けるようにしました。

 21行目のRegExpオブジェクト(regEx)のTestメソッドでは、括弧内の文字列内に、先程Patternプロパティに指定した検索文字列が含まれるかどうかを評価します。

 他に、ファイル一覧表示の為のロジックを削除していますが、該当個所をどのように表現するかを苦慮しまして、上記のlevel5.vbsの行番号にアンダーラインを入れることにしました。例えば、10行目にアンダーラインが入っていますが、これは、10行目と11行目の間にあった行を削除していることを意味しています。

実行してみましょう

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

level5.vbsファイルをダブルクリックして実行

 実行すると、上記のように「ファイル」という文字列を含む行が全て表示されます。ところが、「OK」をクリックして先に進めていくと、最後の2つのファイルはファイル名しか表示されませんでした。これは、「ファイル」という文字列が1つも含まれていない為に、このような状態となってしまっていると思われます。

 そんな訳で、何か変なメッセージボックスも表示されたりもしますが、とりあえず、このレベルでなんとなく検索できるようになりました(笑。不便ですが、2行目の検索対象フォルダや、4行目の検索文字列を変えることで、任意のフォルダ、任意の文字列を検索することができますので、色々試してみて下さい。

 さて、今回はここまでです。次回のLevel.6では、空のメッセージボックスをなんとかしたいと思います。



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