【入門編】【ファイル同期】2つのフォルダ内の最新更新日時を比較し、最新差分のみを自動集約する同期スクリプト – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで「同期」を支配する:ファイルシステムオブジェクト(FSO)による賢い差分更新術

こんにちは。システム自動化の現場で長年、泥臭い自動化スクリプトから大規模な統合までを見てきたエンジニアです。

皆さんは「2つのフォルダの間で、常に最新のファイルだけを保持したい」という作業を、手作業でやっていませんか?あるいは、巨大なファイルを丸ごと上書きコピーして時間を浪費していませんか?

VBScriptの真髄であるFileSystemObject (FSO) を使いこなせば、そんなルーチンワークは一瞬で終わります。今日は、単なるコードのコピペではなく、「なぜそう書くのか」「どこでプログラムが詰まるのか」という本質を解説します。

—

1. なぜFSOを使うのか?

VBScriptにおいて、ファイル操作の王様が `Scripting.FileSystemObject` です。
こいつの素晴らしい点は、OSのファイルシステムを「オブジェクト」として抽象化してくれるところ。パスの連結からタイムスタンプの取得まで、Windowsが理解する言葉を直接扱えるようになります。

陥りやすい罠:パスの区切り文字

初心者が最初にぶつかる壁が「パスの連結」です。`Folder & “\” & Filename` と書くのが面倒で、つい `Folder & Filename` と書いてしまい、エラーの迷宮に迷い込みます。FSOを使うときは、常に「パスを適切に繋ぐ」意識を持ちましょう。

—

2. 差分同期スクリプト:魂のコード

今回のゴールは、「ソースフォルダ(元)」と「デスティネーションフォルダ(先)」を比較し、更新日時が新しいものだけをコピーするロジックです。

‘ FSOのインスタンス生成(お約束の儀式)
Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 同期設定
Dim srcPath, dstPath
srcPath = “C:\SourceFolder”
dstPath = “D:\DestFolder”

SyncFolders fso, srcPath, dstPath

Sub SyncFolders(fso, 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

‘ 1. デスティネーションにファイルが存在しない場合 → 即コピー
‘ 2. 存在する場合 → 更新日時を比較
If Not fso.FileExists(targetFile) Then
file.Copy targetFile, True
WScript.Echo “新規コピー: ” & file.Name
Else
Dim destFileObj
Set destFileObj = fso.GetFile(targetFile)

‘ DateLastModified(最終更新日時)を比較
If file.DateLastModified > destFileObj.DateLastModified Then
file.Copy targetFile, True
WScript.Echo “更新適用: ” & file.Name
End If
End If
Next
End Sub

‘ 最後にオブジェクト解放
Set fso = Nothing

—

3. コードの「急所」を解説する

このコードが「現場で通用する理由」を3点に絞って解説します。

① `DateLastModified` という魔法

Windows OSは、各ファイルが「いつ最後に触られたか」という情報をメタデータとして保持しています。`DateLastModified` プロパティを使うことで、ファイルの中身をわざわざバイナリで開かなくても、「どちらが新しいか」を0.001秒で判定できます。これが差分更新の本質です。

② `file.Copy` の第2引数 `True`

`file.Copy` メソッドの第2引数は「上書き許可フラグ」です。ここを `True` にしておかないと、既にファイルが存在する場合に「権限エラー」や「ファイル重複エラー」でスクリプトが止まります。自動化において「止まらないこと」は、速度以上に重要です。

③ オブジェクトの解放(ガベージコレクション)

`Set fso = Nothing`。これはVBScriptにおける「終わりの作法」です。メモリを浪費しないことは、大規模なディレクトリを走査する際に非常に重要です。この一行を忘れないエンジニアは、現場で信頼されます。

—

4. 次のステップへ:さらなる高みを目指すなら

このスクリプトは、ファイル単体の更新には強いですが、「フォルダ構造の階層化」や「削除されたファイルの同期(ミラーリング)」には対応していません。

もしあなたが、さらに複雑な要件に立ち向かうなら、以下のような拡張を検討してみてください。

  • 再帰処理 (Recursion): サブフォルダまで潜り込んで同期をかける。
  • ログ出力: どのファイルが何時に更新されたかをテキストファイルに書き出す。

VBScriptは古い言語と言われますが、Windowsの深淵を操作する力は今なお最強クラスです。ここをクリアすれば、あなたはもう「マクロの記録」で悩む初学者ではありません。

自信を持ってください。あなたの書いたコードが、誰かの、あるいはあなた自身の退屈な作業を、確実に一つ減らしているはずですから。

何か詰まったら、いつでも戻ってきてください。現場の知見は常にここにありますよ。

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