【入門編】【環境変数操作】WScript.Shell.Environment を利用したシステム・ユーザー環境変数の動的追加と更新手順 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
業務を自動化しようとシェルスクリプトやバッチファイルを触っていると、必ずぶin壁(壁)にぶつかるのが「環境変数」の存在です。

「プログラムの中で動的にパスを追加したい」
「一時的な作業フォルダの場所を環境変数からスマートに取得したい」

そんなとき、VBScriptの `WScript.Shell.Environment` オレゴン……じゃなかった、コレクションを使いこなせるようになると、自動化の幅が一気に広がります。今回は、システム、ユーザー、そしてプロセスごとの環境変数を自由自在に操る極意を、優しく紐解いていきましょう。

ここをクリアすれば、Windows環境におけるスクリプト制御の基本はバッチリですよ!

1. そもそも「環境変数」ってなに?(図解イメージ)

Windowsが動くとき、OSやアプリが「共通して参照するメモ帳」のようなものを用意しています。これが環境変数です。
例えば、Windowsが「ユーザーのホームフォルダはどこだっけ?」と探すとき、`USERPROFILE` というメモを見て判断しています。

VBScriptからこのメモを書き換えたり読んだりするときに使うのが、`WScript.Shell` オブジェクトの `Environment` コレクションです。

環境変数には、影響範囲(スコープ)によって以下の4つのタイプが存在します。

  • Process(プロセス): スクリプトが実行されている間だけの「お絵描きボード」。スクリプトが終了すると消えます。一番安全。
  • User(ユーザー): 現在ログインしているユーザー専用の永続的なメモ。次回のログイン時にも引き継がれます。
  • System(システム): パソコン全体の永続的なメモ。変更するには管理者権限(UAC昇格)が必須です。
  • Volatile(ボラタイル): ログインセッション中だけ有効な揮発性のシステム環境変数。

2. 実践!環境変数の「取得」「追加」「削除」

それでは、実際のコードを見てみましょう。
メモ帳(テキストエディタ)を開いて、以下のコードを `env_test.vbs` という名前で保存してください。

‘ =================================================================
‘ WScript.Shell.Environment の基本操作サンプル
‘ =================================================================
Option Explicit

Dim wshShell, envProcess, envUser
Set wshShell = WScript.CreateObject(“WScript.Shell”)

‘ 1. プロセススコープのEnvironmentコレクションを取得
Set envProcess = wshShell.Environment(“Process”)

‘ 【取得】既存の環境変数(例: USERNAME)を読み取る
WScript.Echo “現在のユーザー名: ” & envProcess(“USERNAME”)

‘ 【追加・更新】プロセス空間に一時的な環境変数を定義する
envProcess(“MY_APP_MODE”) = “Debug”
WScript.Echo “設定直後のMY_APP_MODE: ” & envProcess(“MY_APP_MODE”)

‘ 【削除】設定した環境変数を削除する(空文字を代入するのではなく、変数自体を消す感覚)
‘ ※ 注意: Processスコープでは変数名に空を代入するとエラーになることがあるため、
‘ 基本的にはスコープを分けるか、後述の仕組みを使います。

‘ オブジェクトのクリーンアップ(メモリの解放)
Set envProcess = Nothing
Set wshShell = Nothing

WScript.Echo “処理が完了しました。”

コードのポイント解説

  • `WScript.CreateObject(“WScript.Shell”)` で、Windowsのシェルを操作する権利(切符)を取得しています。
  • `wshShell.Environment(“Process”)` のように引数にスコープ名を渡すことで、特定の領域の環境変数リスト(コレクション)にアクセスできます。

3. 【重要】ユーザー・システム環境変数を触る際の注意点

プロセススコープはスクリプトが終われば消えてしまいますが、User(ユーザー)System(システム)の環境変数を書き換えると、Windowsの設定そのものが書き換わります。

ここで、実務で絶対に知っておくべき「罠」が2つあります。

罠その1:Systemを触るには「管理者権限」が必要

システムの環境変数(`wshShell.Environment(“System”)`)を書き換える場合、一般権限のままVBScriptを実行すると、「権限がありません (Permission denied)」という残酷なエラーで弾かれます。スクリプトを「管理者として実行」させる配慮が必要です。

罠その2:変更が他のアプリに即座に反映されない?

ユーザーやシステムの環境変数を書き換えても、すでに起動しているコマンドプロンプトや他のアプリケーションには、変更がリアルタイムで反映されないことがあります。
OSレベルでの「環境変数が変わったよ!」という通知(`WM_SETTINGCHANGE`メッセージのブロードキャスト)をVBScript単体で行うのは少し骨が折れるため、永続的な環境変数をいじる際は、「設定が反映されるのは次回の起動時、あるいはセッション再接続時」という前提を設計に組み込んでおくと安全です。

4. 現場で使える!安全な環境変数チェック&設定関数

実務でそのままコピー&ペーストして使える、エラーハンドリングを含めた実用的な関数をプレゼントします。特定の環境変数があるかどうか安全にチェックし、なければ追加するスニペットです。

Option Explicit

Call SetUserEnvironmentVariable(“MY_TOOL_PATH”, “C:\MyTools”)

Sub SetUserEnvironmentVariable(varName, varValue)
Dim shell, envUser
On Error Resume Next ‘ 万が一のエラーを優しくキャッチする準備

Set shell = CreateObject(“WScript.Shell”)
‘ ユーザー環境変数にアクセス
Set envUser = shell.Environment(“User”)

If Err.Number <> 0 Then
WScript.Echo “エラー: シェルオブジェクトの作成に失敗しました。”
Exit Sub
End If

‘ 値の設定
envUser(varName) = varValue

If Err.Number = 0 Then
WScript.Echo “成功: ユーザー環境変数 [” & varName & ” = ” & varValue & “] を設定しました。”
Else
WScript.Echo “失敗: エラー番号 ” & Err.Number & ” が発生しました。”
End If

‘ 後片付け
On Error GoTo 0
Set envUser = Nothing
Set shell = Nothing
End Sub

先輩エンジニアからの温かいアドバイス

いかがでしょうか? `WScript.Shell.Environment` は、一見地味に見えますが、複数のツールやパスを動的に束ねる自動化スクリプトにおいては「心臓部」とも言える機能です。

初心者のうちは、まずは影響範囲の狭い `”Process”` スコープを使って安全に実験を繰り返し、慣れてきたら `”User”` や `”System”` にステップアップしていくのが、爆発を起こさない(パソコンを壊さない)一番の近道です。

ここさえマスターすれば、VBScriptの環境構築系スクリプトで怖いものはありません。ぜひ自分の環境でも試してみてくださいね。応援しています!

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