【入門編】【複数フォルダ差分同期】FileSystemObject とファイルサイズ・更新日時比較による軽量バックアップエンジン – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!エンジニアリングの世界へようこそ。
今日は、重たい専用ソフトや複雑なバッチツールを一切使わず、Windows標準の機能――VBScript(Visual Basic Scripting Edition)の力を借りて、超軽量かつ高速な「フォルダ差分同期エンジン」を自分の手で作り上げる方法を解説します。

「毎日、大事な作業ファイルを別のフォルダに手動でコピーするのが面倒……」
「でも、全部上書きコピーすると時間がかかるし、変更したファイルだけをスマートにバックアップしたい!」

そんな現場の悩みを、たった数十行の洗練されたコードで鮮やかに解決してみせましょう。
ここをクリアすれば、あなたも単なるツールの使用者から、「Windows環境を意のままに操る自動化エンジニア」の仲間入りです。さあ、一緒にVBScriptの本質へと足を踏み入れましょう!

—

1. なぜVBScriptなのか? 現場で生きる「軽量バックアップ」の思想

私たちが日常的に使うWindowsには、最初からWSH(Windows Script Host)という強力なスクリプト実行環境が備わっています。特別なインストール作業は不要。メモ帳さえあれば、今この瞬間から動き出します。

今回作るバックアップエンジンのコンセプトはシンプルです。

  • 重い外部ツールに頼らない(PCの環境を汚さない)
  • 「差分」だけを見る(ファイルサイズと最終更新日時を比較し、新しいものだけをコピー)
  • メモリとCPUに優しい(VBScriptの根幹である `FileSystemObject` を駆使し、最小限の負荷で動作する)

「マクロの記録」から一歩進み、OSのファイルシステムを直接手なずける感覚をここで掴んでください。

—

2. コア技術の解説:FileSystemObject(FSO)の作法

VBScriptでファイルやフォルダを操作するとき、絶対に避けて通れないのが `Scripting.FileSystemObject`(通称:FSO) です。

オブジェクトの生成と破棄のライフサイクルを意識することが、プログラミングの第一歩。コードを見ていきましょう。

‘ FSOのインスタンスを生成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 処理が終わったら必ずメモリから解放する(プロの作法です)
Set fso = Nothing

このFSOを使うことで、フォルダの存在確認、ファイルの列挙、さらにはファイルの「サイズ」や「最終更新日時(DateLastModified)」を一発で取得できるようになります。今回の差分同期エンジンは、まさにこの2つの情報(サイズと更新日時)を比較の武器にします。

—

3. 実装!超軽量・差分同期スクリプトの全容

それでは、開発現場でそのままコピペして使える実用コードを公開します。
デスクトップなどに `sync.vbs` という名前で保存し、メモ帳で開いて以下のコードを貼り付けてみてください。

‘ ==============================================================================
‘ スクリプト名: SimpleFolderSync.vbs
‘ 概要: 指定した元フォルダから先フォルダへ、差分(新規・更新ファイル)のみをコピー
‘ ==============================================================================

Option Explicit ‘ 宣言漏れによるバグを防ぐプロの鉄則

Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ — 【設定エリア】ここを用途に合わせて書き換えてください —
Dim sourceDir, destDir
sourceDir = “C:\Work\SourceFolder” ‘ コピー元(マスター)のパス
destDir = “C:\Backup\DestFolder” ‘ コピー先(バックアップ)のパス
‘ ————————————————————-

‘ メイン処理の実行
WScript.Echo “同期処理を開始します…”
Call SyncFolders(fso, sourceDir, destDir)
WScript.Echo “すべての同期処理が完了しました!”

‘ オブジェクトの解放
Set fso = Nothing

‘ ==============================================================================
‘ フォルダ再帰同期サブルーチン
‘ ==============================================================================
Sub SyncFolders(fso, srcPath, dstPath)
Dim srcFolder, subFolder, file, destFile
Dim targetDestFile, isCopyNeeded

‘ コピー元フォルダが存在するかチェック
If Not fso.FolderExists(srcPath) Then
WScript.Echo “エラー: コピー元フォルダが見つかりません: ” & srcPath
Exit Sub
End If

‘ コピー先が存在しなければ自動作成
If Not fso.FolderExists(dstPath) Then
fso.CreateFolder(dstPath)
WScript.Echo “フォルダを作成しました: ” & dstPath
End If

Set srcFolder = fso.GetFolder(srcPath)

‘ 1. 【ファイル比較とコピー判定】
For Each file In srcFolder.Files
targetDestFile = dstPath & “\” & file.Name
isCopyNeeded = False

If Not fso.FileExists(targetDestFile) Then
‘ パターンA: コピー先にファイルが存在しない(新規追加)
isCopyNeeded = True
Else
‘ パターンB: 既に存在する場合は、サイズまたは更新日時を比較
Set destFile = fso.GetFile(targetDestFile)

‘ 「サイズが違う」または「コピー元の方が新しい」場合にコピー対象とする
If (file.Size <> destFile.Size) Or (file.DateLastModified > destFile.DateLastModified) Then
isCopyNeeded = True
End If
Set destFile = Nothing
End If

‘ コピー実行フラグが立っていれば実行
If isCopyNeeded Then
fso.CopyFile file.Path, targetDestFile, True ‘ True = 上書き許可
WScript.Echo “[更新/追加] ” & file.Name
End If
Next

‘ 2. 【サブフォルダの巡回(再帰処理)】
For Each subFolder in srcFolder.SubFolders
Dim newDestSubPath
newDestSubPath = dstPath & “\” & subFolder.Name

‘ 再帰的に自分自身を呼び出して下層フォルダを掘り下げる
Call SyncFolders(fso, subFolder.Path, newDestSubPath)
Next

Set srcFolder = Nothing
End Sub

—

4. コードの深掘り:ここがエンジニアのこだわりポイント

初心者のうちは「ファイルを全部コピーすればいいや」と考えがちですが、ファイルが増えてくると数分、数十分とかかるようになります。このスクリプトが高速な理由は以下の2点にあります。

① `Option Explicit` による厳格な変数宣言

VBScriptはデフォルトでは変数を宣言せずに使えてしまいますが、これはタイポ(打ち間違い)によるバグの温床になります。先頭に `Option Explicit` を置くことで、すべての変数を `Dim` で宣言することを強制し、品質の担保を図っています。

② 「更新日時」と「サイズ」のダブルチェック

If (file.Size <> destFile.Size) Or (file.DateLastModified > destFile.DateLastModified) Then

この一行がこのエンジンの心臓部です。
ファイル名だけでなく、サイズとタイムスタンプ(DateLastModified)を比較することで、「中身が書き換わったファイル」だけを正確に検知します。無駄な上書き処理が発生しないため、圧倒的な軽快さを誇ります。

③ 再帰呼び出し(Recursion)による無限の階層対応

`SyncFolders` サブルーチンの中で、自分自身を再度呼び出しています(`Call SyncFolders(…)`)。これにより、フォルダの中にフォルダが何重にネスト(階層化)されていても、自動的に一番奥のファイルまで漏れなく探し出して同期してくれます。

—

5. 陥りやすい罠とエラー回避のコツ

現場でこのスクリプトを動かす際、よくあるつまずきポイントを事前にシェアしておきます。

  • パスの最後尾の「\(バックスラッシュ)」に注意

コード内のパス指定(`C:\Work\SourceFolder`)では、末尾に `\` を入れない設計にしています。コード内で `dstPath & “\” & file.Name` のように結合しているため、末尾に `\` を入れてしまうと `\\` と二重になり、パスエラーの原因になります。

  • ファイルの排他制御(使用中エラー)

コピーしようとしているまさにそのファイルが、ExcelやWordで開かれっぱなしになっている場合、FSOはファイルを上書きできずにエラーで止まることがあります。実運用では、バックアップ対象のファイルは閉じた状態で実行するようにしましょう。

—

まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!
今回扱った「FileSystemObjectの走査」「ファイルの属性比較」「サブルーチンの再帰呼び出し」は、VBScriptにおける実用プログラミングの三大要素です。

ここをクリアしたあなたなら、Windows環境でのファイル自動整理、ログファイルの自動集計、定型業務のバックアップなど、あらゆる自動化の要求をスマートにカタチにできるはずです。

「面倒な作業は、コードに書かせて秒で終わらせる」
このエンジニアの特権を、ぜひこれからの実務に活かしてくださいね。それでは、次回の技術解説でお会いしましょう!

タイトルとURLをコピーしました