【VBScript】「Cドライブ固定」からの卒業。環境に依存しない堅牢なパス解決術
こんにちは。自動化の世界へようこそ。
VBScriptを触り始めると、多くの人が最初にぶつかる壁が「ハードコーディングの呪縛」です。
「とりあえず `C:\Windows\…` と書いておけば動くでしょ?」
その考え、今日で終わりにしましょう。サーバー環境や特殊なパーティション構成では、OSが `Dドライブ` や `Eドライブ` にインストールされていることも珍しくありません。「動くコード」ではなく「どこでも動くコード」を書くことこそ、エンジニアの第一歩です。
今日は、Windowsの深淵に触れるWMI(Windows Management Instrumentation)の力を借りて、OSのブートドライブを確実に特定する「プロの作法」を伝授します。
—
1. なぜハードコーディングが「悪」なのか
コードの中に `C:\` と書き込むことは、「このプログラムは特定の環境でしか生きられない」と宣言しているのと同じです。
- 環境の変化に弱い: OSの再インストールやドライブ構成の変更で即座にクラッシュします。
- 保守性の欠如: 修正箇所が増えるたびに、すべての文字列を置換しなければなりません。
私たちは「WindowsというOSが、今どこを拠点にしているか」を、OS自身に問いかけるコードを書く必要があります。
—
2. システムドライブを特定する「正解」のコード
VBScriptで最も堅牢な方法は、`Win32_OperatingSystem` クラスを利用することです。これはWindowsの心臓部から直接情報を引き出すための強力なインターフェースです。
以下のコードをコピーして、`.vbs` ファイルとして保存してみてください。
Option Explicit
‘ ———————————————————
‘ 関数名: GetSystemDrive
‘ 概要: WMIを使用してOSがインストールされているドライブを特定する
‘ ———————————————————
Function GetSystemDrive()
Dim objWMIService, colOS, objOS
‘ WMIサービスに接続(ローカル環境)
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ OS情報を取得するクエリ
Set colOS = objWMIService.ExecQuery(“Select SystemDrive From Win32_OperatingSystem”)
‘ 取得した結果からドライブ文字(例: C:)を取り出す
For Each objOS In colOS
GetSystemDrive = objOS.SystemDrive
Next
‘ メモリ解放の作法(VBScriptでは必須の儀式です)
Set colOS = Nothing
Set objWMIService = Nothing
End Function
‘ — 実行確認 —
Dim sysDrive
sysDrive = GetSystemDrive()
WScript.Echo “現在のシステムドライブは [” & sysDrive & “] です。”
—
3. コードのポイント解説
このコードには、VBScriptを使いこなすためのエッセンスが詰まっています。
① `Option Explicit` は開発者の良心
冒頭の `Option Explicit` を忘れないでください。これを書くと、変数の宣言漏れをエラーとして検知してくれます。「動いているはずなのに動かない」という怪奇現象の9割は、タイポによる未定義変数が原因です。
② WMI(Windows Management Instrumentation)の力
`GetObject(“winmgmts:\\.\root\cimv2”)` という呪文は、Windowsの管理情報へアクセスするためのパスポートです。ここから `Win32_OperatingSystem` という「OSそのものの情報」を叩くことで、環境変数に頼りすぎない正確な情報を引き出しています。
③ オブジェクトの解放(Nothing)
VBScriptはガベージコレクションが非常に緩やかです。大きなスクリプトを書く際、`Set オブジェクト = Nothing` で明示的にメモリを解放する習慣は、メモリリークを防ぐための「プロの作法」です。
—
4. 陥りやすい罠:環境変数とWMIの使い分け
初心者がよくやるのが「環境変数の `SystemDrive` を使う方法」です。
`WScript.CreateObject(“WScript.Shell”).ExpandEnvironmentStrings(“%SystemDrive%”)`
これでも基本的には動きます。しかし、WMIを使う方がより「システムに近い階層」からの情報取得であるため信頼性が高いのです。環境変数はユーザーによって書き換えられる可能性がありますが、WMIのデータはOSの構成情報そのものだからです。
—
最後に:自動化のエンジニアへ
「とりあえず動けばいい」コードは、半年後のあなた自身を苦しめます。
今回紹介した「環境から情報を取得する」という考え方は、VBScriptだけでなく、PowerShellやPython、あるいは業務効率化のUI Automationにおいても共通の「銀の弾丸」です。
まずはこのコードを、あなたのツールボックスに入れてみてください。
ここをクリアすれば、あなたはもうマクロの記録をポチポチ押すだけのユーザーではありません。OSを自在に操るエンジニアの入り口に立っています。
何か分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化ライフを心から応援しています!
