VBScriptを再定義する:DateLastModifiedで実現する「ゼロ・オーバーヘッド」同期の極意
業務自動化の世界で、VBScriptを「過去の遺物」と切り捨てるのは簡単だ。だが、Windows環境において、余計なランタイムを一切必要とせず、メモ帳一つで即座に展開できるこの言語の機動力は、今なお唯一無二の武器である。
今回は、単にファイルをコピーするだけのスクリプトではない。「なぜ、この設計なのか」というアーキテクトの視点から、DateLastModifiedプロパティを用いた、高効率かつ堅牢な差分バックアップの真髄を授ける。
—
1. なぜ「単純なコピー」が敗北するのか
多くの初心者は、全ファイルを対象に `CopyFile` を実行する。これは小規模な環境なら許されるが、数万ファイルに及ぶデータ群では「IOの無駄な消費」と「ロックによるタイムアウト」という致命的なボトルネックを引き起こす。
我々が目指すべきは「必要最小限の差分のみを物理層で叩く」ことだ。
FileSystemObject (FSO) が提供する `DateLastModified` プロパティを軸に、以下の設計指針を貫く。
- 冪等性の確保: 何度実行しても同じ状態になること。
- 例外の局所化: 一つのファイルがロックされていても、処理全体を停止させない。
- ログの可視化: どのファイルが更新されたかを追跡可能にする。
—
2. 実装:プロダクション級の同期ツール
このスクリプトは、ソースフォルダからデスティネーションへ、更新日時が新しいものだけを転送する。
Option Explicit
‘ — 設定エリア —
Const SOURCE_DIR = “C:\SourceData”
Const DEST_DIR = “D:\BackupData”
‘ ——————
Dim fso, srcFolder, destFolder
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ディレクトリ存在確認
If Not fso.FolderExists(DEST_DIR) Then fso.CreateFolder(DEST_DIR)
Set srcFolder = fso.GetFolder(SOURCE_DIR)
SyncFolder srcFolder, DEST_DIR
WScript.Echo “同期完了。”
‘ 再帰的にフォルダを走査するメイン関数
Sub SyncFolder(currentFolder, targetPath)
Dim file, subFolder, destFilePath
‘ ターゲットフォルダがなければ作成
If Not fso.FolderExists(targetPath) Then fso.CreateFolder(targetPath)
‘ ファイルの比較とコピー
For Each file In currentFolder.Files
destFilePath = fso.BuildPath(targetPath, file.Name)
If Not fso.FileExists(destFilePath) Then
file.Copy destFilePath, True
WScript.Echo “[NEW] ” & file.Name
Else
‘ 最終更新日時の比較(ここがキモ)
If file.DateLastModified > fso.GetFile(destFilePath).DateLastModified Then
file.Copy destFilePath, True
WScript.Echo “[UPDATE] ” & file.Name
End If
End If
Next
‘ サブフォルダの再帰処理
For Each subFolder In currentFolder.SubFolders
SyncFolder subFolder, fso.BuildPath(targetPath, subFolder.Name)
Next
End Sub
—
3. コードの背後にある「極限の知見」
1. `DateLastModified` の信頼性
ネットワークドライブを跨ぐ場合、サーバーとクライアントの時計のズレや、ファイルシステムのタイムスタンプ解像度(FAT32とNTFSの差など)に注意が必要だ。しかし、同一OS環境内でのバックアップであれば、このプロパティは最も軽量で高速な指標となる。ハッシュ値(MD5等)計算による比較は、IO負荷が大きすぎて大規模環境には不向きである。
2. パフォーマンスへの配慮
このコードでは `fso.GetFile` をループ内で呼び出している。これはオブジェクトをインスタンス化するコストを伴うため、数百万ファイル単位の同期を行う場合は、事前に全ファイル情報を辞書オブジェクト(Dictionary)にキャッシュしてから比較を行う設計へ移行すべきだ。
3. エラーハンドリングの鉄則
本番環境で動かす際は、`On Error Resume Next` を適切に配置し、特定のファイルが「使用中」でコピーに失敗しても、ツール全体が落ちないように設計せよ。ログファイルへの書き出し機能を付加し、何が成功し、何が失敗したのかを記録することが、保守性の高いツールの条件である。
—
4. 最後に:エンジニアとしての矜持
VBScriptは「古い言語」ではない。「OSの深層に最も近い場所で、軽量に振る舞える特権的なツール」だ。
このスクリプトをベースに、あなたが管理する環境の要件に応じて、ログ出力やメール通知機能を組み込んでほしい。自動化において最も重要なのは、コードの長さではなく、「現場の運用コストをどれだけ削ぎ落とせるか」という一点に尽きる。
さあ、今すぐこのコードを叩き込み、手動作業の呪縛から自身を解放せよ。それが、プロフェッショナルとしての第一歩だ。
