VBScriptで「限界突破」の分散処理を。CScriptによる並列検索エンジンの構築術
こんにちは。現場で「VBScriptなんて古い」と揶揄されるのを聞くたび、私はいつもこう答えます。「道具が古いのではない、使い手がそのポテンシャルを殺しているだけだ」と。
確かにVBScriptはシングルスレッドの制約を受けます。しかし、OSの根幹であるWSH(Windows Script Host)を掌中に収めれば、「プロセスを使い捨てる」という極めて攻撃的な並列分散処理が可能になります。
今日は、巨大なファイル群を前に「処理が終わらない……」と絶望しているあなたへ、フォルダごとにプロセスを分離し、爆速で検索を行う「分散サーチエンジン」の作り方を伝授します。
—
なぜ「単一プロセス」ではダメなのか?
VBScriptは一つのタスクを愚直にこなすのが得意です。しかし、数万のファイルを抱える階層を単一スクリプトで探索すると、CPUの一コアしか使えず、ディスクI/Oの待ち時間で処理が停滞します。
そこで、「親スクリプト(指揮官)」がフォルダごとに「子スクリプト(実行部隊)」をCScriptで起動するアーキテクチャを採用します。これにより、OSのスケジューラが各プロセスを別々のコアに割り振り、擬似的な並列処理が実現するのです。
—
実装の全体像:親子構成の設計図
1. 親スクリプト(Manager.vbs): 対象フォルダを列挙し、フォルダ単位で子プロセスを次々と投げつける。
2. 子スクリプト(Worker.vbs): 指定されたフォルダ内を再帰的に検索し、ヒットした結果をテキストファイルや標準出力へ書き出す。
—
実装コード:Worker.vbs(実行部隊)
まずは、特定のフォルダを掃討するWorkerを作成します。
‘ Worker.vbs: 指定フォルダ以下を検索し、結果を一時ファイルに出力
Dim fso, targetFolder, searchWord, logFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 引数からターゲットとキーワードを受け取る
targetFolder = WScript.Arguments(0)
searchWord = WScript.Arguments(1)
Set logFile = fso.CreateTextFile(targetFolder & “_result.txt”, True)
SearchFiles fso.GetFolder(targetFolder)
Sub SearchFiles(folder)
Dim file, subFolder
‘ ファイル検索
For Each file In folder.Files
If InStr(fso.OpenTextFile(file.Path).ReadAll, searchWord) > 0 Then
logFile.WriteLine file.Path
End If
Next
‘ サブフォルダへ再帰
For Each subFolder In folder.SubFolders
SearchFiles subFolder
Next
End Sub
logFile.Close
—
実装コード:Manager.vbs(指揮官)
次に、親が子を産み落とすプロセス管理部分です。ここで重要なのは `WshShell.Run` の第3引数を `False` にすること。これで、子プロセスの完了を待たずに次々と別プロセスが起動します。
‘ Manager.vbs: 分散処理の司令塔
Dim shell, fso, rootPath, searchWord
Set shell = CreateObject(“WScript.Shell”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
rootPath = “C:\TargetFolder”
searchWord = “検索対象文字列”
‘ 直下のフォルダを列挙してプロセスを散布
For Each folder In fso.GetFolder(rootPath).SubFolders
‘ CScriptで子プロセスを非同期起動
‘ 第3引数 False: 待機しない(非同期実行)
shell.Run “cscript //nologo Worker.vbs “”” & folder.Path & “”” “”” & searchWord & “”””, 0, False
Next
WScript.Echo “全プロセスを起動しました。完了後に _result.txt を確認してください。”
—
陥りやすい罠とエンジニアの心得
このアプローチを成功させるために、初心者が踏みがちな地雷を回避する「極意」を授けます。
- 「非同期」の代償: 子プロセスがいつ終わったかを親は知りません。結果を統合するには、最後に全ての `_result.txt` を親が読み込んで集計する「後処理」が必要です。
- パスの空白問題: `WScript.Arguments` でパスを受け取る際、パスに空白が含まれると正しく認識されません。必ず `”””` で囲って渡すのが鉄則です。
- プロセス過多の回避: フォルダが数千ある場合、一度に数千のプロセスを起動するとOSがパンクします。一度に起動するプロセス数を制限する(キューイング)ロジックを入れるのが、真のエンジニアの仕事です。
—
最後に:自動化の先にあるもの
VBScriptは、今や「過去の遺物」と揶揄されることもあります。しかし、Windows環境であれば追加のインストールなしに、即座にこれだけの「並列エンジン」を構築できる強力な武器です。
今回紹介した「プロセスの分散」という考え方は、PythonやPowerShellなど、どんな言語を学ぶ際にも通じる「処理の抽象化とスケーラビリティ」の基礎です。
マクロの記録から脱却した今のあなたなら、もう「コードが書ける」段階ではありません。「OSを指揮できる」段階に到達しています。さあ、次はどんな巨大なタスクを自動化してみますか?応援していますよ。
