こんにちは!現場でバリバリ自動化を進めていると、こんな壁にぶつかったことはありませんか?
「USBメモリを挿したとき、自動で特定のフォルダからファイルをバックアップしたい。でも、挿すポートや他のUSB機器の抜き差しによって、ドライブレター(`E:` や `F:` など)がコロコロ変わってしまう……!」
マクロの記録や、固定のパスに頼ったスクリプトを作っているうちは、この「ドライブレターの変動」という呪縛から逃れられません。しかし、今回解説する FileSystemObject (FSO) の `GetDrive` と `VolumeName`(ボリューム名) を使いこなせるようになれば、ハードウェアの物理的な変化に左右されない、極めてロバスト(堅牢)な自動化スクリプトが組めるようになります。
ここをクリアすれば、あなたのVBScriptのスキルは間違いなく「中級者の 扉」を叩くことになります。一緒に本質をマスターしていきましょう!
—
1. ドライブレターの罠と「ボリューム名」という救世主
まず、Windowsのファイルシステムにおけるドライブの扱いを整理しましょう。
通常、私たちが目にする `C:` や `D:` といったアルファベット(ドライブレター)は、OSが「空いている場所」から動的に割り振っている仮の看板にすぎません。
そのため、昨日まで `E:` ドライブだったUSBメモリが、今日はカードリーダーを挿したせいで `F:` ドライブに格上げされる、なんてことは日常茶飯事です。
ここで発想を逆転させます。
「ドライブレターが変わるなら、USBメモリに付けた『名前(ボリューム名)』で識別すればいいじゃないか」
これをVBScriptで実現するのが、FSOが持つドライブオブジェクトの `VolumeName` プロパティです。
—
2. 実装コード:ラベル名でUSBを自動特定し、ファイルを退避する
お待たせしました。実務でそのままコピー&ペーストして使える、精緻なエラーハンドリング付きのスクリプトを提示します。
メモ帳を開き、以下のコードを `auto_backup.vbs` という名前で保存してください。
‘ ==============================================================================
‘ Script Name: USB Auto Backup Script (VolumeName Identification)
‘ Description: ドライブレターに依存せず、指定のボリューム名を持つUSBを検出し
‘ ローカルの特定フォルダからファイルを自動退避する
‘ ==============================================================================
Option Explicit
Const TARGET_VOLUME = “BACKUP_USB” ‘ ターゲットとなるUSBのボリューム名
Const SOURCE_FOLDER = “C:\Work\Data” ‘ 退避元(ローカル)のフォルダパス
Const LOG_FILE = “C:\Work\backup_log.txt”
Sub Main()
Dim fso, drives, drv, targetLetter
Dim sourcePath, destPath
Dim shell
‘ FileSystemObjectの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
targetLetter = “”
‘ 1. PCに接続されている全ドライブを走査
Set drives = fso.Drives
For Each drv in drives
‘ ドライブが準備完了状態(USBやHDDが正しく挿入されているか)を確認
If drv.IsReady Then
‘ ドライブタイプ 1 は Removable(リムーバブルディスク)を示す
If drv.DriveType = 1 Then
‘ オンエラーでボリューム名取得時のReadエラーをガード
On Error Resume Next
If drv.VolumeName = TARGET_VOLUME Then
targetLetter = drv.DriveLetter ‘ 例: “E”
On Error GoTo 0
Exit For
End If
On Error GoTo 0
End If
End If
Next
‘ 2. ターゲットのUSBが見つからなかった場合の処理
If targetLetter = “” Then
MsgBox “指定されたボリューム名 [” & TARGET_VOLUME & “] のUSBメモリが見つかりません。”, vbCritical, “バックアップエラー”
Exit Sub
End If
‘ 3. バックアップ先のパスを構築(例: E:\BackupFolder)
destPath = targetLetter & “:\BackupFolder”
‘ 4. 退避先フォルダがUSB内に存在しなければ新規作成
If Not fso.FolderExists(destPath) Then
fso.CreateFolder(destPath)
End If
‘ 5. ファイルのコピー実行(上書き許可 = True)
If fso.FolderExists(SOURCE_FOLDER) Then
‘ ソース内の全ファイルをデスティネーションへコピー
fso.CopyFile SOURCE_FOLDER & “\.”, destPath & “\”, True
‘ 成功ログの記録
Call WriteLog(“SUCCESS: ” & SOURCE_FOLDER & ” から ” & destPath & ” へバックアップ完了。”)
MsgBox “USBメモリへのファイル退避が正常に完了しました!”, vbInformation, “完了”
Else
MsgBox “退避元のフォルダが見つかりません: ” & SOURCE_FOLDER, vbExclamation, “警告”
End If
‘ オブジェクトの解放
Set fso = Nothing
Set shell = Nothing
End Sub
‘ 簡易ログ出力関数
Sub WriteLog(msg)
Dim fso, logStream
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ForAppending (8) でファイル末尾に追加、Trueでファイル未存在時は新規作成
Set logStream = fso.OpenTextFile(LOG_FILE, 8, True)
logStream.WriteLine “[” & Now & “] ” & msg
logStream.Close
Set logStream = Nothing
End Sub
‘ メイン処理の呼び出し
Call Main()
—
3. コードのキモをエンジニア目線で解説
ここからは、プログラミング中級者へのステップアップとして、このコードに隠された「VBScriptを安全に動かすための極意」を解説します。
① `Option Explicit` はプロの証
冒頭にある `Option Explicit`。これを記述すると、変数宣言(`Dim`)を強制できます。
VBScriptはデフォルトでは変数宣言なしで値を入れることができてしまいますが、タイポ(スペルミス)によるバグの温床になります。実務でコードを書くときは、必ずおまじないのようにこれを先頭に書きましょう。
② `drv.IsReady` という防波堤
USBメモリを挿した直後や、接触不良のドライブにアクセスしようとすると、VBScriptは容赦なく 「ディスクが準備されていません (Device not ready)」 という致命的なランタイムエラーを吐いてスクリプトを強制終了させます。
これを防ぐために、`If drv.IsReady Then` で「今、アクセスしても安全か?」を必ずチェックしています。この一手間が、安定稼働するシステムの命運を分けます。
③ リムーバブル判定 (`drv.DriveType = 1`)
PC内部の固定ハードディスク(`C:` や `D:`)やネットワークドライブを誤認しないよう、`DriveType` が `1`(リムーバブルディスク=USBメモリやSDカード)であるものだけに絞り込んでいます。
④ `On Error Resume Next` の正しい使い方
「エラーを完全に無視する悪者」のように言われがちなこの構文ですが、正確には「この一行だけ、エラーが発生してもスクリプトを止めずに次の処理に進む」という防護壁です。
ボリューム名(`VolumeName`)を取得する際、セキュリティ権限やメディアの仕様によって稀に例外が発生することがあります。そのため、判定部分だけ一時的にエラーをスルーさせ、安全にループを抜けられるようにしています。
—
4. 陥りやすい罠とトラブルシューティング
現場でこのスクリプトを運用する際によくあるトラブルをあらかじめ共有しておきます。
- 罠1: ボリューム名の大文字・小文字、全角・半角の不一致
- `VolumeName` は完全一致で判定されます。「`BACKUP_USB`」と「`Backup_USB`」や、全角スペースが混ざっているだけでも別物とみなされます。事前のフォーマット時にボリューム名は厳密に統一しましょう。
- 罠2: ファイルがロックされている
- コピー元のファイルを他のアプリケーション(Excelなど)が開いている場合、`CopyFile` メソッドで「権限がありません」というエラーが出ます。必要に応じて、コピー前にファイルを閉じるアナウンスを挟むなどの配慮が必要です。
—
おわりに
いかがでしたでしょうか?
ファイルシステムオブジェクト(FSO)とドライブのプロパティを組み合わせることで、単なる「ファイルのコピー」が、ハードウェア環境の揺らぎを吸収する「スマートな自動化ソリューション」へと生まれ変わります。
ここをクリアできれば、VBScriptを使ったキッティングツールや、現場の自動化バッチ作成において怖いものはありません。ぜひ自分の環境でUSBのラベル名を書き換えて、テストしてみてくださいね。あなたの業務自動化の旅を、心から応援しています!
