【実務・中級編】【ドライブ種別判定】FileSystemObject の DriveType プロパティを用いたリムーバブル・ネットワークドライブ自動分岐 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

現場のエンジニアへ:その「ドライブ判定」、メモリとI/Oの墓場になっていないか?

業務自動化の現場で最も頻繁に遭遇する「初歩的だが致命的な罠」。それが、ドライブ種別の判定ミスによるデータ損失と処理の停滞だ。

USBメモリの取り外しによる例外、ネットワークドライブのタイムアウト、ローカルHDDの領域不足。これらを `On Error Resume Next` で力技でねじ伏せていないか? それはエンジニアリングではない。ただの「運任せのコーディング」だ。

今日は、`FileSystemObject (FSO)` の `DriveType` プロパティを軸に、堅牢で、かつパフォーマンスを損なわない「ドライブ自動分岐」のアーキテクチャを伝授する。

1. なぜ「雑な判定」がツールを殺すのか

多くの開発者が陥る失敗は、ドライブが存在するかどうかの確認(`Drive.IsReady`)を怠ったり、無意味なループでI/Oを発生させ続けたりすることだ。

VBScriptはインタープリタ言語である。重いI/O処理をループ内に記述すれば、OSのレスポンスを奪い、システム全体をフリーズさせる。特にネットワークドライブ(`DriveType = 3`)が切断されている状態でアクセスを試みると、OS側のタイムアウトまでスレッドがハングアップする。

「叩く前に、相手の素性を知る」。これが鉄則だ。

2. 実装の極意:DriveType を活用した堅牢な設計

以下に、プロダクション環境でそのまま使える、堅牢なドライブ判定モジュールを提示する。このコードの肝は、「例外を発生させないための事前チェック」にある。

‘ ==============================================================================
‘ DriveManager.vbs
‘ 目的: 接続メディアの種別を判別し、安全なI/Oパスを確定させる
‘ ==============================================================================
Option Explicit

Dim fso, targetDrive, driveInfo

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 判定対象のドライブレター
targetDrive = “E:”

‘ 判定実行
WScript.Echo GetDriveStatus(targetDrive)

Function GetDriveStatus(drvLetter)
Dim d

‘ ドライブが存在するかどうかをまず確認
If Not fso.DriveExists(drvLetter) Then
GetDriveStatus = “Error: ドライブが存在しません。”
Exit Function
End If

Set d = fso.GetDrive(drvLetter)

‘ IsReadyを確認しないままDriveTypeにアクセスすると、メディア未挿入時に死ぬ
If Not d.IsReady Then
GetDriveStatus = “Error: ドライブの準備ができていません。”
Exit Function
End If

‘ DriveTypeによる分岐
‘ 0:Unknown, 1:Removable, 2:Fixed, 3:Remote, 4:CD-ROM, 5:RAMDisk
Select Case d.DriveType
Case 1
GetDriveStatus = “Removable: USBメモリ等は書き込み禁止ポリシーを確認せよ。”
Case 2
GetDriveStatus = “Fixed: ローカルストレージ。高速I/Oが許可される。”
Case 3
GetDriveStatus = “Remote: ネットワークドライブ。レイテンシを考慮せよ。”
Case Else
GetDriveStatus = “Other: 特殊デバイス。”
End Select
End Function

3. 運用・保守の現場で意識すべき「3つの鉄則」

コードを書くだけでは不十分だ。現場の運用担当者が泣かないために、以下の設計指針を遵守せよ。

① ネットワークドライブの「再接続待ち」はさせない

ネットワークドライブが切断されている場合、`fso.DriveExists` は `False` を返す。この時、「再接続を促すメッセージ」をログに出力して終了せよ。 無理に `WshNetwork.MapNetworkDrive` で再接続を試みるコードは、環境依存のトラブルを招く元凶だ。接続管理はOS(GPO等)に任せ、スクリプトは「接続されている前提」で動くのが最もクリーンである。

② I/Oのバッファリングを意識する

ネットワーク越しに大量のファイルをコピーする場合、VBScriptの `CopyFile` をループさせるのは推奨しない。帯域を占有し、他の業務アプリケーションを殺す可能性がある。ファイルサイズが大きい場合は、一度ローカルのテンポラリ領域にキャッシュし、そこから処理を行うのが「デキるエンジニア」の流儀だ。

③ オブジェクトのライフサイクルを制御する

`Set fso = Nothing` を忘れるな。VBScriptにおいて明示的なメモリ解放は、特に長時間のバックグラウンド処理において重要だ。メモリリークは「昨日は動いていたのに今日は動かない」という、最も始末に負えないバグを生む。

結論:コードは「対話」である

自動化ツールは、PCという名の無機質な機械を動かすための「指示書」だ。ドライブの種別を判定するということは、相手がUSBなのか、HDDなのか、ネットワークなのかを見極め、その相手に合わせた礼儀(適切な処理)を尽くすことと同義である。

さあ、このコードをベースに、君の現場の自動化を一歩先へ進めてくれ。
コードの美しさは、そのまま業務効率の高さに直結するのだから。

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