正規表現(ファイル名検索)

動作とソース

vbsファイルの置いてあるフォルダ(デスクトップでも可)にあるファイルを一覧し、正規表現で検索します。

正規表現処理は、VBSの得意とするところで、割と簡単です。正規表現関連の用法はいくつかありますが、今回はサワリだけって感じで。

コピペして使うときはソースだけ繋いでください。

'■正規表現を使って検索する■
'*変更はここで*******************
'大文字小文字を区別する=False /しない = True
const LS_CHECK = True 	
'一度に表示するファイル数の制限
const ALL_FILES = 20
'********************************
set objFS = CreateObject("Scripting.FileSystemObject")
set ObjFolder =objFS.getfolder(".\")

Dim counter , StrFiles ,FilterStr
'ファイル名を一覧し、正規表現で指定します
counter = 1
StrFiles = ""
For Each ObjFD In ObjFolder.Files
	'ファイル数が多ければ一定数以上は表示しない
	If counter > ALL_FILES then 
		StrFiles = StrFiles & "... and more files."
		Exit For
	End If
	StrFiles = StrFiles & ObjFD.name & vbcrlf
	counter = counter + 1
next

'ファイル名をインプットボックスから取得する
FltrStr = Inputbox("検索文字列を正規表現で指定してください" & Vbcrlf _
		& Vbcrlf _
		& StrFiles ,"正規表現ファイル検索")
		
If FltrStr = "" then	'入力がなければMsgBox表示後終了
	MsgBox("(入力なし)" & Vbcrlf & "終了します")
	WScript.Quit(1)
End If

ここまでは特に正規表現は使ってません。inputboxでキーワードを取得するくらいです。

'正規表現で一致する部分のあるファイル名をリストアップする
Set objRE = new RegExp
objRE.IgnoreCase = LS_CHECK
objRE.pattern = FltrStr

RegExpというまんまなオブジェクトのお世話になります。今回はほんの一部の機能しか使いません。.IgnoreCaseでは、大文字と小文字の区別をするかしないかを決定します。Trueで「区別しない」Falseで「区別します」

.patternには検索したい語句を正規表現で入れます。InputBoxで取得した文字列を、ここに入れることにします。

StrFiles = ""	'変数初期化
counter = 1		'初期化
For Each objFD In ObjFolder.Files
	If objRE.test(objFD.name) = true then	'ファイル名に検索項目があり、
		If Cmp_Name(objFD.name) = true	Then	'検索項目がファイル名と完全一致すれば
			StrFiles = StrFiles & objFD.name & vbcrlf
			counter = counter + 1
		End If
	End If
	If counter > ALL_FILES then 	'一定以上ならそれ以上表示しない
		StrFiles = StrFiles & "... and more files."
		Exit For
	End If
next

objRE.testは、検索文字列があるかどうかを返します。ただ、このままでは本当に「名前の中に検索文字列があるかどうか」を調べるだけなので、望んだような結果はでません。例えば、.*\.tmp(最後が.tmpの文字列)と入力すると「hogehote.tmp.bmp」というファイルも「中に.tmpで終わる文字列があるよ」という理由で、引っかかってしまいます。というわけで、完全に一致するかどうかを見る関数Cmp_Name()を用意しました。文字列が検索項目と完全一致するかどうかを調べて、一致すればtrueを返す関数です。関数として別に分けたのはソースを多少見やすくするためだけです。というわけで、後ほど式が出ます。

If StrFiles = "" then
	MsgBox("該当ファイルはありませんでした" & Vbcrlf & "終了します")
	WScript.Quit(1)
End If

'変換後の名前を入力する
Dim tmp '無意味な変数。返り値を納めないと、パラメータを設定したMsgBoxはエラーになる
tmp = MsgBox ("以下のファイル名が一致しました" & vbcrlf & vbcrlf _
		& "該当ファイル名"	& vbcrlf _
		& "--------------------------"	& vbcrlf _
		& StrFiles , , "検索結果")

'MsgBox("完了")

'* FUNCTION / SUB ******************************************
'ファイル名と検索内容が完全一致すればtrueを返す
Function Cmp_Name(StrName)
	set Matches = objRE.Execute(StrName)
	If Matches.item(0).value = StrName then
		Cmp_Name = true
	Else
		Cmp_Name = false
	End If
End Function

set Matches = objRE.Excute(文字列)で、文字列内からobjRE.pattern に一致するものを探しだし、見つけた数だけMatchesにコレクションします。普通はそれを個別に取得して使うようですが、今回はその必要がないのでコレクションの0番(最初に一致した文字列)がファイル名と全く同じであれば、Trueを返すようにしました。

コメントにも書いてますが。MsgBoxのパラメータを省略し、文字の表示だけを行う場合はMsgBox("hoge" & hoge)なんて感じで動くわけですが、パラメータを使う(ボタン形式の指定やタイトルバーの文字指定など;MsgBox("hoge",4,"hoge")みたいに)と、返り値を受け止めてあげないとエラーがでるようです。というわけで、無意味変数を用意しました。


もどる