こんにちは。現場の最前線でコードと格闘する皆さんへ。
今日は、業務自動化の「第一歩」であり、同時に「一生モノの武器」となる、FileSystemObject(FSO)を用いたホットフォルダ監視システムについてお話ししましょう。
「マクロの記録」から一歩踏み出し、自分の意志でPCを操る感覚……。このスクリプトを書き上げたとき、皆さんはただのオペレーターから「自動化エンジニア」へと進化します。
—
1. なぜ「監視ループ」なのか?
業務において、「特定のフォルダにファイルが置かれたら、自動的に処理を開始する」という要件は、自動化のまさに王道です。
VBScriptには、OSのイベントを直接受け取るようなリッチな仕組みはありません。しかし、その分、「FileSystemObject(FSO)」を使って泥臭く監視するという、極めてシンプルで堅牢な手法が取れます。
今回の設計思想
- ポーリング監視: 一定間隔でフォルダを覗きに行き、ファイルが増えたかを確認します。
- WScript.Sleep: CPUを焼き切らないための「休息」です。これがないとPCは停止します。
- 無限ループ: `Do…Loop`で、あなたが止めるまで働き続けます。
—
2. 実践:ホットフォルダ監視スクリプト
以下のコードをコピーし、メモ帳に貼り付けて `.vbs` 拡張子で保存してください。
‘ — 設定エリア —
Const WATCH_FOLDER = “C:\Temp\Input” ‘ 監視するフォルダ
Const SLEEP_TIME = 2000 ‘ 監視間隔(ミリ秒)
‘ ——————
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダが存在するかチェック
If Not fso.FolderExists(WATCH_FOLDER) Then
MsgBox “監視対象フォルダが見つかりません: ” & WATCH_FOLDER, 16, “エラー”
WScript.Quit
End If
Set objFolder = fso.GetFolder(WATCH_FOLDER)
MsgBox “監視を開始します。” & vbCrLf & “終了するにはスクリプトを強制停止してください。”
‘ 無限ループ開始
Do
‘ フォルダ内のファイル数を取得
If objFolder.Files.Count > 0 Then
‘ ファイルがある場合、処理を開始
For Each objFile In objFolder.Files
‘ — ここに自動処理を記述 —
WScript.Echo “検出しました: ” & objFile.Name
‘ 例:処理済フォルダへ移動(移動しないと無限ループで処理し続けるため必須!)
‘ fso.MoveFile objFile.Path, “C:\Temp\Processed\” & objFile.Name
‘ テスト用にファイルを削除(運用時は移動推奨)
objFile.Delete
Next
End If
‘ CPU負荷を抑えるための休憩
WScript.Sleep SLEEP_TIME
Loop
—
3. このコードを理解するための「3つの鍵」
① `FileSystemObject` という「目」
VBScriptには標準でファイル操作機能がありますが、FSOを使うことで、人間がエクスプローラーを操作するのと同様の挙動が可能になります。`CreateObject(“Scripting.FileSystemObject”)` は、Windowsという巨大なOSに「ファイル操作用の道具を貸してください」と頼む儀式です。
② `WScript.Sleep` の重要性
初心者が必ず陥る罠が「ループの中に`Sleep`を入れないこと」です。これを行うと、CPU使用率が100%に張り付き、PCがフリーズします。2秒(2000ミリ秒)という休息は、人間が気づかないほどの瞬きですが、OSにとっては休息に十分な時間です。
③ 「処理済み」のケア(最重要)
このスクリプトで最も重要なのは、「処理したファイルをどうするか」です。
ファイルが存在する限り`For Each`は回り続けます。処理したファイルを別のフォルダへ`MoveFile`するか、あるいは`Delete`しない限り、スクリプトは永遠に同じファイルを処理し続けます。ここが「自動化の境界線」です。
—
4. 現場で陥りやすいエラーと対策
- ファイルがロックされている:
コピー中のファイルに触れると「権限がありません」というエラーが出ます。`On Error Resume Next` をうまく使い、エラーを無視して「次のループでまた挑戦する」という設計にすると、堅牢性が一気に上がります。
- パスの指定ミス:
フォルダパスの末尾に `\` を含めるべきか否かで悩む人が多いですが、FSOは柔軟なので、基本的にはどちらでも動きます。ただし、記述は統一しましょう。
—
最後に:先輩からのアドバイス
VBScriptは古くからある言語ですが、今なおWindows環境において最強の「即効性のある自動化ツール」です。今回作ったこの監視ループは、将来的にPowerShellやPythonへ移行する際にも、同じ「設計思想」をそのまま活かすことができます。
まずはこのスクリプトを動かし、フォルダにファイルをポンと投げ込んでみてください。
自分の書いたコードでPCが反応する瞬間……その快感こそが、エンジニアの原点です。
不明点があれば、いつでも聞いてくださいね。応援しています!
