Programming Field

特定のUSBメモリが接続されたときにだけ自動処理を実行 - Windowsコマンド実用例

USBメモリをPCに接続した際、特定のボリュームラベルを持つUSBメモリだけに対して自動的にバックアップや同期などの処理を行うバッチスクリプト例を紹介します。タスクスケジューラを利用して接続検知を自動化する応用例もあわせて解説します。

使用コマンド

  • For - 複数ドライブの走査処理
  • Vol - ボリュームラベルの確認
  • Findstr - 文字列の検索
  • Robocopy - フォルダー同期処理
  • If - 条件分岐処理
  • 「>」 - 出力リダイレクション(NULとともに用いて出力を抑制)

バッチファイルの例

@echo off
setlocal
set LABEL=MY_USB
set SRCDIR=C:\Data
set BACKUPDIR=backup

for %%D in (D E F G H I J K) do (
  vol %%D: 2>NUL | findstr /i "%LABEL%" >NUL
  if not errorlevel 1 (
    echo USBメモリ %%D: を検出しました。
    robocopy "%SRCDIR%" "%%D:\%BACKUPDIR%" /MIR
    exit /b
  )
)

echo 指定されたUSBメモリは接続されていません。

この例では、「MY_USB」というボリュームラベルの付いたドライブ(USBメモリ)を「D~K」のドライブから検索し、見つかった場合「C:\Data」のデータをそのドライブの「backup」ディレクトリにコピー(ミラーリング)しています。

補足事項

  • ボリュームラベルはエクスプローラー上で設定可能です(USBメモリのドライブの「プロパティ」→入力欄にラベルを入力)。
  • 検索対象ドライブレター(D~Kなど)は、必要に応じて適宜調整してください。
  • 最初に検出した1台だけ処理する設計になっているため、複数台同時接続される場合の考慮が必要な場合は調整が必要です。

応用例:接続検知を自動化する

Windowsの「タスク スケジューラ」で「イベント発生時に実行」設定を使うと、USBメモリが接続されたタイミングでバッチを自動実行できます。以下の手順で設定可能です。

  1. タスク スケジューラを開く (Windows 11 の場合は「Windows ツール」内にあります。また、「タスク スケジューラ」と検索しても実行できます。)
  2. 「タスクの作成」→「トリガー」で「イベントで開始」を選択
  3. 以下のフィールドにそれぞれ内容を設定
    • ログ: Microsoft-Windows-DriverFrameworks-UserMode/Operational
    • イベントID: 2003 (「デバイス接続」を意味します)
    • アクション: 上記で作成したバッチファイルを実行

コマンドラインから設定する場合は以下のように Schtasks コマンドを使うことも可能です。

schtasks /Create /TN "USBMonitor" /TR "C:\scripts\usb_backup.bat" /SC ONEVENT /EC Microsoft-Windows-DriverFrameworks-UserMode/Operational /MO *[System[(EventID=2003)]] /RU SYSTEM /F

これにより、USBメモリを挿入した瞬間に自動的に検出・同期処理が開始されます。

関連項目