【実務・中級編】【初心者向け】FileSystemObjectのDriveExistsメソッドを用いた外部ドライブ接続状態の安全な判定 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

序文:そのスクリプトは「現場」に耐えられるか?

業務自動化の世界へようこそ。私はこれまで数多の基幹システム連携や自動化ツールを構築してきたが、初心者が書くコードで最も脆(もろ)いのが「外部環境への依存」に対する想像力だ。

「昨日は動いたのに、今日はエラーで止まった」
「USBメモリを挿し忘れただけでスクリプトが異常終了し、後続のDB更新処理が中途半端に終わった」

これらはすべて、設計段階での「防衛的プログラミング(Defensive Programming)」の欠如が招いた人災だ。特に外部ドライブやネットワーク共有フォルダを扱う際、「パスが存在すること」を前提にコードを書くのは、ブレーキのない車で高速道路を走るようなものだ。

今回は、FileSystemObject(FSO)の中でも基本中の基本でありながら、堅牢なツール作成には欠かせない `DriveExists` メソッドを軸に、プロフェッショナルが実践する「絶対に落ちない判定ロジック」を伝授する。

—

1. なぜ「DriveExists」が必要なのか?

初心者は、いきなり `FSO.GetFolder(“E:\Data”)` と書き始める。だが、もしUSBメモリが抜けていたら? もしネットワークの瞬断でドライブレターが外れていたら? VBScriptは冷酷に「パスが見つかりません」というエラーを吐き、そこで処理を投げ出す。

プロの仕事は違う。「対象が存在しない可能性」を常に織り込み、存在しないなら「安全に、かつ理由を明示して」処理を中断させることだ。

DriveExists の役割

`FileSystemObject.DriveExists` は、指定したドライブ文字(または共有名)が、現在のOSに認識されているかを Boolean(True/False)で返す。これを用いることで、物理的なアクセスを試みる前に「門前払い」のチェックが可能になる。

—

2. 現場で即戦力となるプロダクションコード

単に `DriveExists` を使うだけでなく、実務で使い回せる「関数化」されたコードを提示する。このままコピーして、君のモジュールの一番下に貼り付けておきたまえ。

‘ ===========================================================================
‘ 関数名: IsExternalDriveReady
‘ 引数 : strDriveLetter – 判定対象のドライブ文字 (例: “E”, “Z:\”)
‘ 戻り値: Boolean – 使用可能なら True
‘ 説明 : ドライブの存在確認に加え、メディアが挿入されているか(IsReady)まで判定する
‘ ===========================================================================
Function IsExternalDriveReady(strDriveLetter)
Dim fso, drivePath
IsExternalDriveReady = False

‘ 入力値の正規化(先頭の1文字のみ抽出してドライブ形式にする)
drivePath = Left(strDriveLetter, 1)

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. ドライブそのものがシステムに認識されているか?
If fso.DriveExists(drivePath) Then
‘ 2. ドライブは準備完了状態か?(メディア未挿入のSDカードリーダーなどを除外)
‘ ※DriveExistsだけでは「空のドライブレター」を拾ってしまうため、
‘ 実際にアクセス可能かを IsReady プロパティで確認するのが定石だ。
If fso.GetDrive(drivePath).IsReady Then
IsExternalDriveReady = True
End If
End If

Set fso = Nothing
End Function

‘ — 実装例 —
Dim targetDrive
targetDrive = “E”

If IsExternalDriveReady(targetDrive) Then
WScript.Echo “ドライブ ” & targetDrive & ” は正常に接続されています。処理を開始します。”
‘ ここにファイルコピーやDB連携のメインロジックを記述する
Else
WScript.Echo “【エラー】ドライブ ” & targetDrive & ” が未接続、または準備ができていません。”
WScript.Echo “USBメモリの接続を確認してください。”
WScript.Quit ‘ 安全な終了
End If

—

3. チーフアーキテクトの視点:なぜこの設計なのか

① 「DriveExists」だけでは不十分な理由

SDカードリーダーやDVDドライブを想像してほしい。ドライブレター(D: や E:)は存在するが、中身が空という状態がある。`DriveExists` は `True` を返すが、ファイル操作をすればエラーになる。
そこで私は、必ず `GetDrive(drivePath).IsReady` を併用する。これが「現場の知恵」だ。

② オブジェクトのライフサイクル管理

コード内で `Set fso = Nothing` を明示している点に注目してほしい。VBScriptはスクリプト終了時にメモリを解放するが、大規模なループ処理や長時間稼働するツールでは、この小さな作法がメモリリークを防ぎ、OSの安定性に寄与する。

③ ネットワークドライブへの配慮

実務では `Z:` ドライブなどのネットワーク割り当てを多用する。しかし、ネットワークドライブは「ログオン直後は切断状態」になっていることが珍しくない。
もしこの判定が失敗する場合、`DriveExists` を試みる前に一度 `WshNetwork.MapNetworkDrive` で再接続を試みるロジックを検討すべきだ。

—

4. データベース・ファイル連携時の注意点

ドライブの存在確認が取れた後、次に君が直面するのは「排他制御」の問題だ。

1. ファイルオープン中のチェック: `DriveExists` でドライブがあっても、目的のExcelファイルが誰かに開かれていれば、書き込みは失敗する。
2. 書き込み権限の確認: 読み取り専用のUSBメモリではないか?
3. 大容量データの転送: 外付けHDDへのバックアップ中に接続が切れるリスク。書き込み前に `FreeSpace` プロパティで容量をチェックするのも、一流の設計と言える。

—

結論:コードの品質は「優しさ」で決まる

初心者は「動くコード」を書く。
中級者は「速いコード」を書く。
そして、我々プロフェッショナルは「止まらないコード」を書く。

`DriveExists` を適切に配置することは、君のツールを使うユーザー(それは未来の君自身かもしれない)に対する「優しさ」であり、「誠実さ」だ。エラーメッセージで突き放すのではなく、事前に状況を察知し、安全なルートへ誘導する。この積み重ねが、組織における君の信頼を不動のものにするだろう。

今回の知見を、今日からのスクリプト開発に魂として込めてほしい。健闘を祈る。

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