VBScriptで極める「差分バックアップ」:システムの本質を見極める自動化術
こんにちは。自動化の現場で長年戦ってきたエンジニアとして、今日はVBScriptの真髄を伝授しましょう。
「マクロの記録」から一歩踏み出し、OSの深淵を操るツールを作りたい。そう願う君にとって、この「差分バックアップ」スクリプトは最高の登竜門です。単にファイルをコピーするのではなく、「OSが管理するメタデータ(更新日時)を読み解き、最小限の負荷でタスクを完遂する」という、エンジニアとしての基礎体力を磨く絶好の機会です。
—
なぜ「差分」にこだわるのか?
すべてのファイルを毎回コピーするのは、非効率の極みです。10GBのデータから、たった1KBの変更を探し出す。この「差分抽出」の考え方こそが、自動化の現場におけるコスト削減の第一歩です。
私たちが使う武器は FileSystemObject (FSO)。Windowsのファイルシステムを支配する、最も古典的で強力なオブジェクトです。
—
差分バックアップの心臓部:ロジックの設計図
1. ソース(元)とターゲット(先)のフォルダを特定する。
2. ソース内の各ファイルについて、ターゲットに存在するかを確認する。
3. 存在しない場合: 新規作成なのでコピーする。
4. 存在する場合: `DateLastModified`(最終更新日時)を比較する。
- ソースの方が新しければ、上書きコピーする。
- ターゲットの方が新しい、または同じなら、何もしない。
これだけで、PCのI/O負荷を劇的に抑えた「賢いツール」になります。
—
現場でそのまま使える実装コード
以下のコードをテキストエディタ(メモ帳でOK)に貼り付け、`backup.vbs` という名前で保存してください。
‘ — 設定エリア —
Dim srcPath, dstPath
srcPath = “C:\SourceFolder” ‘ コピー元
dstPath = “D:\BackupFolder” ‘ コピー先
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 実行開始
Call SyncFolders(srcPath, dstPath)
Sub SyncFolders(src, dst)
Dim srcFolder, file, targetFile
Set srcFolder = fso.GetFolder(src)
‘ ターゲットフォルダが存在しなければ作成
If Not fso.FolderExists(dst) Then fso.CreateFolder(dst)
‘ 各ファイルを走査
For Each file In srcFolder.Files
targetFile = dst & “\” & file.Name
‘ ターゲットにファイルがない、または更新日時が新しい場合のみコピー
If Not fso.FileExists(targetFile) Then
file.Copy targetFile, True
WScript.Echo “新規コピー: ” & file.Name
Else
If file.DateLastModified > fso.GetFile(targetFile).DateLastModified Then
file.Copy targetFile, True
WScript.Echo “更新コピー: ” & file.Name
End If
End If
Next
End Sub
Set fso = Nothing
WScript.Echo “完了しました。”
—
初学者が必ず躓く「3つの罠」
このスクリプトを動かす際、初心者が陥りやすいポイントを解説します。ここをクリアすれば、もう中級者の仲間入りです。
1. 権限(パーミッション)の壁
VBScriptは実行したユーザーの権限で動きます。もしターゲット先がネットワークドライブや保護されたシステムフォルダなら、エラーが出ます。「自分が手動でファイルを移動できる場所か?」をまずは確認してください。
2. `DateLastModified` の比較の罠
Windowsのファイルシステムでは、コピーした瞬間に「更新日時」が変わる場合があります。今回のコードは単純比較ですが、実務でシビアな環境を扱う際は「1秒程度の誤差は許容する」といったロジックを組み込むのが通のやり方です。
3. オブジェクトの解放(メモリ管理)
`Set fso = Nothing` を忘れないでください。VBScriptは古い言語ゆえに、メモリ管理が甘くなりがちです。大規模なバックアップを回す際は、常に「使い終わったオブジェクトは即座に解放する」という意識を持つことが、安定した自動化の秘訣です。
—
次のステップへ
このスクリプトは、あくまで「フォルダ直下」のみを同期するシンプルなものです。もし君がこれに「サブフォルダの再帰的処理(再帰関数)」を追加できれば、どんな巨大なディレクトリ構造でも同期できる最強のツールになります。
VBScriptはレガシーと言われますが、「OSの挙動を直接制御する」という点において、これほど軽量で即効性のある言語は他にありません。
ここをクリアした君なら、次はWMIを使ってCPU使用率を取得したり、Excelを操作してレポートを自動生成したりと、どんな世界へも行けます。焦らず、一歩ずつ。コードに魂を込めていきましょう。応援しています。
