VBScriptを支配せよ:日次バッチを「自動化の聖域」に変えるフォルダ構築術
現場の諸君、今日も泥臭いスクリプトと格闘しているか?
「毎日同じフォルダを作って、古いファイルを移動する」。そんな単純作業に時間を浪費するのはもう終わりにしよう。VBScriptにおける`Scripting.FileSystemObject`(FSO)は、古臭い技術だと思われがちだが、OSの深淵に直接アクセスできる強力な武器だ。
今回は、「実行日付ベースの自動生成」と「過去資産の安全な退避」を、バグゼロで実現する堅牢なアーキテクチャを伝授する。
—
1. なぜ「手作業」がシステムの死を招くのか
多くの現場では、バッチ処理の冒頭にハードコードされたパスを書いている。だが、それは「技術的負債」の温床だ。
- ハードコーディングの弊害: 環境が変われば即座に沈黙する。
- 例外処理の欠如: フォルダが既に存在する場合、FSOは平然とエラーを吐く。
- クリーンアップの不備: Archive作業を怠れば、ディスクはゴミの山となり、検索性は死に絶える。
我々が目指すべきは、「今日という日付を自ら認識し、過去の遺産を整理し、自らを構築する自律的なスクリプト」だ。
—
2. 堅牢な作業領域構築のためのプロダクションコード
このコードは、単に動くだけではない。エラーを事前に防ぎ、ログ出力の起点となるよう設計している。
‘ =================================================================
‘ Script Name: PrepareWorkspace.vbs
‘ Description: 日付ベースの作業フォルダ作成と過去フォルダの退避
‘ =================================================================
Option Explicit
Dim fso, baseDir, archiveDir, targetFolder, dateStr
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ — 設定項目 —
baseDir = “C:\Work\BatchProcess”
archiveDir = baseDir & “\Archive”
dateStr = Year(Date) & Right(“0” & Month(Date), 2) & Right(“0” & Day(Date), 2)
targetFolder = baseDir & “\Build_” & dateStr
‘ — メイン処理 —
Call CreateDirectoryStructure()
Sub CreateDirectoryStructure()
On Error Resume Next
‘ 1. ベースディレクトリの確認
If Not fso.FolderExists(baseDir) Then fso.CreateFolder(baseDir)
‘ 2. Archiveフォルダの準備
If Not fso.FolderExists(archiveDir) Then fso.CreateFolder(archiveDir)
‘ 3. 本日のフォルダが既に存在するか確認
If fso.FolderExists(targetFolder) Then
WScript.Echo “Info: 本日のフォルダは既に存在します。”
Else
‘ 過去フォルダをArchiveへ移動(Build_で始まるフォルダを対象)
Dim folder, f
Set folder = fso.GetFolder(baseDir)
For Each f In folder.SubFolders
If Left(f.Name, 6) = “Build_” Then
f.Move archiveDir & “\” & f.Name
End If
Next
‘ 本日のフォルダ作成
fso.CreateFolder(targetFolder)
WScript.Echo “Success: ” & targetFolder & ” を作成しました。”
End If
If Err.Number <> 0 Then
WScript.Echo “Critical Error: ” & Err.Description
WScript.Quit 1
End If
On Error GoTo 0
End Sub
—
3. アーキテクトが教える「陥りやすい罠」と対策
1. `On Error Resume Next` の正しい使い方
VBScriptにおいてエラーハンドリングを怠るのは自殺行為だ。だが、闇雲に使うな。「ここから先は例外が発生する可能性がある」と明確なスコープを定義し、処理が終われば直ちに `On Error GoTo 0` で制御を戻す。これがプロの流儀だ。
2. パス操作の柔軟性
`\`(円記号)の扱いに気をつけろ。パスを結合する際、手動で文字を連結すると必ずどこかで `\\` が発生する。本来であれば `fso.BuildPath` メソッドを使うのが最も安全だ。大規模開発では、パス生成を一元管理する関数を一つ作っておくことを推奨する。
3. 排他制御の意識
もしこのスクリプトがWebアプリや常駐サービスから呼ばれる場合、移動中のファイルにアクセスが発生する可能性がある。本番環境で「ファイルが使用中です」というエラーが出るなら、移動の前に `fso.FileExists` ではなく、フォルダを一度リネームして移動する「アトミックな操作」を検討する必要があるだろう。
—
4. 最後に:自動化とは「信頼」を積み上げること
このスクリプトを導入すれば、毎朝のルーチンワークは消滅する。だが、それで終わりではない。
真のエンジニアは、この「作業フォルダ作成」を起点に、「ログの自動生成」「処理終了後のメール通知」と自動化の範囲を広げていく。VBScriptは枯れた技術だが、枯れているからこそ、OSの深いレイヤーで安定して動作し続ける。
さあ、今すぐこのコードを自分の環境にデプロイし、手作業という名の「負債」を完済してくれ。質問があればコメントで送れ。コードの最適化はいつでも歓迎する。
