【入門編】【システムドライブ確実解決】環境変数と Win32_OperatingSystem を組み合わせたOSブートドライブの判定手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【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を自在に操るエンジニアの入り口に立っています。

何か分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化ライフを心から応援しています!

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