VBScriptを掌握する:DateLastModifiedによる超軽量・高速差分バックアップの真髄
「最新のフレームワークがなければ何もできない」というエンジニアが増えた昨今、あえて私はVBScript(WSH)の価値を再定義したい。
Windowsという巨大なOSの深淵において、FileSystemObject (FSO) は未だに最も「素直」で「軽量」な武器だ。数千行の外部ライブラリを読み込むオーバーヘッドを嫌う、真のプロフェッショナルのために。今日は、`DateLastModified` プロパティを軸にした、理論上最も効率的な差分バックアップの構築論を説く。
—
1. 誤解だらけのFSO:なぜ「全コピー」は愚策なのか
システム管理者が陥る最大の罠は、毎回フルバックアップを走らせることだ。ディスクI/Oの浪費は、ネットワーク帯域の枯渇を招き、ディスクコントローラーの寿命を縮める。
我々が目指すべきは、「更新されたファイルのみを、最小限のメタデータ比較で特定する」ことだ。ここで鍵となるのが `File.DateLastModified` プロパティである。これはWindowsのNTFSマスターファイルテーブル(MFT)から直接値を読み取るため、ファイルの中身をハッシュ計算するような非効率な処理とは比較にならないほど高速だ。
2. 実装の極致:メモリ最適化とリソース管理
VBScriptにおいて、オブジェクトの生成と解放は「呼吸」と同じだ。甘い管理はメモリリークを招く。特にループ処理内でのオブジェクト生成は厳禁だ。
以下のコードは、単なるスクリプトではない。大規模なファイルサーバーの同期にも耐えうる、最適化されたプロトタイプである。
‘ Option Explicitは絶対の掟。暗黙の変数定義はバグの温床
Option Explicit
Dim fso, srcFolder, dstFolder
‘ オブジェクトの初期化
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ バックアップ実行関数
Sub SyncFolders(srcPath, dstPath)
Dim srcFolder, dstFolder, file, targetFile
Set srcFolder = fso.GetFolder(srcPath)
‘ 目的地フォルダが存在しなければ生成
If Not fso.FolderExists(dstPath) Then fso.CreateFolder(dstPath)
For Each file In srcFolder.Files
targetFile = fso.BuildPath(dstPath, file.Name)
‘ 差分判定:ファイルが存在しない、あるいは更新日時がソースより古い場合のみコピー
If Not fso.FileExists(targetFile) Then
file.Copy targetFile, True
Else
If file.DateLastModified > fso.GetFile(targetFile).DateLastModified Then
file.Copy targetFile, True
End If
End If
Next
‘ オブジェクトの明示的解放(VBScriptのGCを待たず、即座にリソースを戻す)
Set srcFolder = Nothing
End Sub
‘ 実行例
SyncFolders “C:\SourceDir”, “D:\BackupDir”
‘ 全処理終了後の後始末
Set fso = Nothing
3. シニアエンジニアが意識すべき「隠れたコスト」
このコードを実務で運用する際、以下の3点を忘れてはならない。
1. I/Oのボトルネック: ネットワーク越し(SMB)のバックアップの場合、`DateLastModified` を何度も呼ぶと、その都度ネットワークパケットが発行される。もし同期対象が10万ファイルを超えるなら、一度の走査で全ファイルの属性を配列にキャッシュし、メモリ上で比較を行うアーキテクチャへの切り替えが必要だ。
2. 属性の継承: `FileSystemObject.Copy` はファイルのメタデータを完全には維持しないことがある。もしファイルの作成日時やアクセス権限まで厳密に保持する必要があるなら、WSH単体ではなく `robocopy` のラッパーとしてVBScriptを使うのが、実は最も「賢い」解である。
3. エラーハンドリングの徹底: `On Error Resume Next` を無闇に使うな。特定のパスが読み取り専用だったり、排他制御がかかっている場合、スクリプトは沈黙せずにログを吐いて終了すべきだ。
4. 伝説のアーキテクトからの助言
「自動化」とは、ただスクリプトを書くことではない。「そのスクリプトが、深夜3時に未知の例外に遭遇したとき、いかにしてシステム管理者を助けるか」を設計することだ。
VBScriptはレガシーではない。Windowsが存在する限り、この堅牢なアーキテクチャは生き続ける。今回紹介した比較ロジックは、どんな言語に移行しても変わらない「差分検出のアルゴリズム」の本質である。
これをベースに、ログ出力のバッファリングや、進捗率のパーセンテージ表示などを追加してほしい。その一歩が、君の自動化ツールを「動くもの」から「信頼できるツール」へと昇華させるはずだ。
健闘を祈る。
