【入門編】【デバイス監視】DriveTypeプロパティでリムーバブルメディアやネットワークドライブを識別・自動処理するVBScript – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する極限の知見:DriveTypeプロパティでリムーバブルメディアを識別し、自動処理の神髄を掴む!

皆さん、こんにちは! 最前線で業務自動化を追求するチーフアーキテクトの私が、VBScriptの奥深い世界へと皆さんを誘います。今回は、プログラミング初学者の方や、「マクロの記録」から一歩踏み出したい方に向けて、VBScriptの真骨頂とも言える「ファイルシステムオブジェクト(FSO)」を駆使したドライブ監視について、その極意をお伝えします。

「たかがVBScript?」と侮るなかれ。このシンプルながらも強力なスクリプト言語は、Windows環境における自動化の強力な武器となり得ます。特に、外部デバイスの接続を検知し、適切な処理を自動実行する能力は、あなたの日常業務を劇的に変える可能性を秘めているのです。

なぜ今、VBScriptで「ドライブ監視」なのか?

デジタル化が進む現代において、私たちは日々、様々なデバイスとデータをやり取りしています。USBメモリ、外付けHDD、ネットワークドライブなど、これらメディアの接続状況をプログラムで監視し、自動で適切な処理を実行できたら、どれほど効率的になるでしょうか?

例えば、

  • USBメモリを挿入したら自動で特定フォルダのバックアップを開始。
  • 特定のネットワークドライブが利用可能になったら、データ同期処理を実行。
  • CD-ROMドライブにディスクが挿入されたら、特定のアプリケーションを起動。

といったことが可能になります。

今回は、特に「USBメモリ接続時のみ自動バックアップを開始させる」という、実務で非常に役立つシナリオを例に、そのロジックと実装方法を徹底的に解説していきます。

ファイルシステムオブジェクト(FSO)の基本をマスターする

VBScriptでファイルやフォルダ、そしてドライブを操作する際に、必ずお世話になるのが「FileSystemObject(FSO)」です。これは、Windowsのファイルシステムにアクセスするための、非常に便利な「窓口」となるオブジェクトだと考えてください。

FSOオブジェクトの生成と破棄:極めて重要なライフサイクル管理

まず、FSOを使うための第一歩は、そのインスタンスを生成することです。

‘ FSOオブジェクトを生成
Dim objFSO
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

ここで重要なのが、使い終わったオブジェクトは必ず破棄することです。これは、プログラミングにおけるリソース管理の鉄則であり、パフォーマンスの維持やメモリリーク防止のために、どんなに小さなスクリプトでも意識すべきことです。

‘ オブジェクトの破棄(リソース解放)
Set objFSO = Nothing

「たったこれだけ?」と思うかもしれませんが、これを怠ると、スクリプトが終了した後もメモリ上にオブジェクトが残り続け、システムリソースを無駄に消費する可能性があります。これは、一流のエンジニアなら決して見過ごせないポイントです。

DrivesコレクションとDriveTypeプロパティの深淵

FSOオブジェクトは、Windowsシステム上のあらゆるドライブに関する情報を提供してくれます。その中でも特に強力なのが、システムに接続されているすべてのドライブのリストを保持する`Drives`コレクションと、個々のドライブの種類を示す`DriveType`プロパティです。

Drivesコレクション:システムドライブの宝庫

FSOオブジェクトを通じて、あなたはシステムに接続されているすべてのドライブ(Cドライブ、Dドライブ、ネットワークドライブ、USBメモリなど)を一覧で取得できます。これが`Drives`コレクションです。

‘ すべてのドライブを列挙
For Each objDrive In objFSO.Drives
‘ ここでobjDriveを使って各ドライブの情報にアクセス
Next

この`For Each`ループを使うことで、システム上のドライブを一つ一つチェックしていくことができるわけです。

DriveTypeプロパティ:ドライブの「顔」を識別する

各`Drive`オブジェクトには、そのドライブがどのような種類であるかを示す`DriveType`プロパティがあります。このプロパティが返す値は、以下のいずれかです。

| 値 | 説明 | 実例 |
| :– | :————— | :——————————————— |
| `0` | Unknown | 不明なドライブタイプ(稀に発生) |
| `1` | Removable | リムーバブルメディア(USBメモリ、外付けHDD/SSD、SDカードなど) |
| `2` | Fixed | 固定ディスク(内蔵HDD/SSD、Cドライブなど) |
| `3` | Network | ネットワークドライブ(共有フォルダへのマップ) |
| `4` | CD-ROM | CD-ROM/DVD/Blu-rayドライブ |
| `5` | RAM Disk | RAMディスク(仮想的な高速ディスク) |

今回のテーマである「USBメモリ接続時」を検知するには、この`DriveType`が`1`(Removable)であるかどうかを判定すれば良いのです。

実践!USBメモリ接続時自動バックアップスクリプト

それでは、実際にUSBメモリが接続されたことを検知し、特定のフォルダを自動バックアップするスクリプトを作成してみましょう。

シナリオ設定

  • バックアップ元フォルダ: `C:\MyDocuments\BackupSource`
  • バックアップ先(USBメモリ内)フォルダ: `MyBackup`
  • 監視対象USBメモリのボリューム名: `MYUSB` (※これはUSBメモリのプロパティで設定できる名前です)

コード例:VBScriptで実現する自動バックアップ

‘
‘ ファイル名: AutoUSBBackup.vbs
‘ 説明: USBメモリが接続されたら、特定のフォルダを自動バックアップします。
‘ 対象のUSBメモリはボリューム名「MYUSB」で識別します。
‘ 作成者: あなたの先輩エンジニア
‘ 最終更新日: 2023-10-27
‘

Option Explicit ‘ 変数宣言を強制する。これを入れると、未宣言変数でのミスを防げます。

‘ === 設定値 ===
Const SOURCE_FOLDER = “C:\MyDocuments\BackupSource” ‘ バックアップ元フォルダのパス
Const TARGET_FOLDER_NAME = “MyBackup” ‘ USBメモリ内に作成するバックアップ先フォルダ名
Const TARGET_VOLUME_NAME = “MYUSB” ‘ 監視対象のUSBメモリのボリューム名 (大文字・小文字を区別しません)

‘ 監視間隔 (ミリ秒)。短すぎるとCPU負荷が高まり、長すぎると検知が遅れます。
‘ 通常は数秒~数十秒が妥当です。今回はデモ用に短めに設定しています。
Const MONITOR_INTERVAL_MS = 5000 ‘ 5秒ごとに監視

‘ バックアップが完了したことを示すフラグ
Dim bBackupCompleted : bBackupCompleted = False

‘ FSOオブジェクトを生成
Dim objFSO : Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ バックアップ元フォルダが存在するかチェック
If Not objFSO.FolderExists(SOURCE_FOLDER) Then
WScript.Echo “エラー: バックアップ元フォルダが見つかりません。パスを確認してください: ” & SOURCE_FOLDER
Set objFSO = Nothing ‘ FSOオブジェクトを破棄
WScript.Quit ‘ スクリプトを終了
End If

WScript.Echo “USBメモリ監視スクリプトを開始しました。ボリューム名 ‘” & TARGET_VOLUME_NAME & “‘ のRemovableドライブを監視します。”
WScript.Echo “バックアップ元: ” & SOURCE_FOLDER

‘ — メインループ —
Do While Not bBackupCompleted ‘ バックアップが完了するまでループ
WScript.Echo “ドライブをスキャン中…”

Dim objDrive
Dim bUSBFOUND : bUSBFOUND = False ‘ 今回のループで対象USBが見つかったかどうかのフラグ

‘ 全ドライブを列挙
For Each objDrive In objFSO.Drives
‘ ドライブが準備完了状態か、かつRemovableドライブか、かつボリューム名が一致するか
If objDrive.IsReady And objDrive.DriveType = 1 And UCase(objDrive.VolumeName) = UCase(TARGET_VOLUME_NAME) Then
bUSBFOUND = True
WScript.Echo “対象USBメモリ ‘” & objDrive.VolumeName & “‘ (” & objDrive.Path & “) を検出しました。”

Dim targetPathOnUSB : targetPathOnUSB = objDrive.Path & “\” & TARGET_FOLDER_NAME

‘ バックアップ先フォルダが存在しない場合は作成
If Not objFSO.FolderExists(targetPathOnUSB) Then
On Error Resume Next ‘ エラーが発生しても処理を続行(フォルダ作成失敗時など)
objFSO.CreateFolder targetPathOnUSB
If Err.Number <> 0 Then
WScript.Echo “エラー: バックアップ先フォルダ ‘” & targetPathOnUSB & “‘ の作成に失敗しました。”
WScript.Echo “エラー詳細: ” & Err.Description
On Error GoTo 0 ‘ エラー処理をリセット
Exit For ‘ このUSBドライブでの処理を中断し、次のドライブへ
End If
On Error GoTo 0 ‘ エラー処理をリセット
WScript.Echo “バックアップ先フォルダ ‘” & targetPathOnUSB & “‘ を作成しました。”
End If

‘ バックアップ処理の実行
On Error Resume Next ‘ エラーが発生しても処理を続行(ファイルコピー失敗時など)
objFSO.CopyFolder SOURCE_FOLDER & “\”, targetPathOnUSB & “\”, True ‘ 上書き許可
If Err.Number <> 0 Then
WScript.Echo “エラー: バックアップ処理中に問題が発生しました。”
WScript.Echo “エラー詳細: ” & Err.Description
On Error GoTo 0 ‘ エラー処理をリセット
‘ エラー発生時はバックアップ完了フラグを立てず、再試行を促すか、エラー報告を検討
Else
WScript.Echo “バックアップが完了しました: ” & SOURCE_FOLDER & ” -> ” & targetPathOnUSB
bBackupCompleted = True ‘ バックアップが成功したらループを終了
End If
On Error GoTo 0 ‘ エラー処理をリセット
Exit For ‘ 目的のUSBが見つかり処理が完了したら、他のドライブはチェックしない
End If
Next

If Not bUSBFOUND Then
WScript.Echo “対象USBメモリ ‘” & TARGET_VOLUME_NAME & “‘ はまだ見つかりません。”
End If

If Not bBackupCompleted Then
WScript.Sleep MONITOR_INTERVAL_MS ‘ 設定された間隔だけ待機
End If
Loop

WScript.Echo “スクリプトを終了します。”

‘ FSOオブジェクトを破棄(リソース解放)
Set objFSO = Nothing

コードのポイント解説

1. `Option Explicit`: 変数宣言を強制します。これにより、スペルミスによる意図しない変数使用を防ぎ、バグの発生を抑制できます。プロの現場では必須の記述です。
2. 設定値の外部化: `SOURCE_FOLDER`などのパスは、コードの先頭で`Const`(定数)として定義しています。これにより、変更が必要になった際に、この部分だけを修正すればよく、保守性が向上します。
3. `objFSO.Drives`のループ: `For Each objDrive In objFSO.Drives`で、システム上のすべてのドライブを一つずつ検査しています。
4. `objDrive.IsReady`: ドライブが使用可能な状態か(例えば、CD-ROMドライブにディスクが入っているか、USBメモリが正常に認識されているか)を確認します。これがないと、準備ができていないドライブにアクセスしようとしてエラーになることがあります。
5. `objDrive.DriveType = 1`: これが今回の主役! ドライブの種類が「Removable」(リムーバブル)かどうかを判定します。
6. `UCase(objDrive.VolumeName) = UCase(TARGET_VOLUME_NAME)`: USBメモリを特定するために、ボリューム名(USBメモリに付けた名前)を使用しています。`UCase`関数を使って大文字・小文字を区別しない比較を行うことで、入力ミスによる問題を回避します。より堅牢な識別には、`SerialNumber`プロパティも検討できますが、今回はシンプルにボリューム名を使います。
7. `objFSO.CopyFolder`: 指定されたフォルダの内容を、別の場所へコピーします。`SOURCE_FOLDER & “\”`とすることで、フォルダ内のすべてのファイルとサブフォルダを対象とします。最後の`True`は、上書きを許可するかどうかです。
8. エラーハンドリング (`On Error Resume Next` と `Err` オブジェクト): フォルダ作成やファイルコピー中に予期せぬエラーが発生した場合でもスクリプトが停止しないよう、`On Error Resume Next`を使用しています。エラーが発生したかどうかは`Err.Number`で確認し、必要に応じてエラーメッセージを表示します。プロのスクリプトには必須の安全策です。
9. `WScript.Sleep MONITOR_INTERVAL_MS`: `Do While`ループで無限にドライブを監視し続けるとCPUを大量消費してしまいます。`WScript.Sleep`で一定時間スクリプトの実行を一時停止させることで、システムへの負荷を軽減しています。
10. `Set objFSO = Nothing`: スクリプトの最後で、FSOオブジェクトを忘れずに破棄しています。これが「伝説的なチーフアーキテクト」が常に意識するリソース管理の基本です。

スクリプトの実行方法と注意点

1. 上記コードをコピーし、任意のテキストエディタ(メモ帳など)に貼り付けます。
2. ファイル名を`AutoUSBBackup.vbs`などとし、拡張子を`.vbs`で保存します。
3. 作成した`.vbs`ファイルをダブルクリックすると、スクリプトが実行されます。コマンドプロンプトウィンドウが開いて、スクリプトの実行状況が表示されます。
4. 設定したボリューム名を持つUSBメモリをPCに挿入してみてください。しばらくすると、自動でバックアップが開始されるはずです。

運用上の注意点

  • 継続的な監視とリソース: 今回のスクリプトは`WScript.Sleep`を使っていますが、これはシンプルな監視方法です。より高度なシステムでは、WindowsのタスクスケジューラやWMI(Windows Management Instrumentation)のイベント監視機能を利用することで、必要な時だけスクリプトが起動するような、より効率的でリソース負荷の低い監視システムを構築できます。これは、VBScriptをさらに深く学ぶ上での次のステップとなるでしょう。
  • セキュリティ: 不明なスクリプトは安易に実行しないでください。今回はご自身で作成したスクリプトですが、インターネットからダウンロードしたVBScriptファイルは、悪意のある動作をする可能性もあります。常に信頼できるソースからのみスクリプトを入手・実行するよう心がけてください。
  • 権限: スクリプトがファイルをコピーする場所や、フォルダを作成する場所に対して、実行ユーザーが適切な書き込み権限を持っている必要があります。

さらに一歩進んだ活用法(上級者へのヒント)

今回のスクリプトはシンプルなUSBメモリのボリューム名での識別でしたが、以下のような応用も可能です。

  • 厳密なデバイス識別: USBメモリには「シリアルナンバー」という、個体ごとにユニークな識別子があります。`objDrive.SerialNumber`プロパティを使えば、ボリューム名が同じでも異なるUSBメモリを区別し、より確実な処理を実現できます。
  • ネットワークドライブの監視: `DriveType = 3`を判定すれば、ネットワークドライブの接続状況を監視できます。特定の共有フォルダが利用可能になったら、自動でデータを同期する、といった処理が可能です。
  • イベントドリブンな監視: VBScript単体では難しいですが、WMIと組み合わせることで、「USBデバイスが接続された瞬間」をトリガーにしてスクリプトを起動するといった、よりリアルタイムなイベントドリブン処理が可能です。これは非常に強力な概念であり、業務自動化の可能性を大きく広げます。

まとめ:VBScriptの基本をマスターし、次のステップへ!

今回の記事では、VBScriptのFileSystemObjectを使い、`Drives`コレクションと`DriveType`プロパティを使ってリムーバブルメディアを識別し、自動処理を実行する方法を解説しました。オブジェクトの生成と破棄、エラーハンドリング、そして実用的なコード例を通じて、VBScriptの基本と、それが実務でいかに強力なツールとなるかを理解いただけたかと思います。

ここをクリアすれば、VBScriptの基本はバッチリですよ!

この知識を土台として、さらに深掘りすることで、あなたのPC環境や業務は、これまで以上にスマートで効率的なものへと進化していくでしょう。VBScriptの可能性は無限大です。さあ、次の自動化の扉を開きましょう!

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