【入門編】【複数プロセス分散処理】フォルダ単位で別CScriptプロセスを起動し並列でテキスト検索を行う分割処理タスク – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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を指揮できる」段階に到達しています。さあ、次はどんな巨大なタスクを自動化してみますか?応援していますよ。

タイトルとURLをコピーしました