こんにちは!VBScriptの世界へようこそ。
Excelマクロ(VBA)の「ボタンをポチッと押す世界」から一歩踏み出し、黒い画面(コマンドプロンプト)やWindowsの裏側でスマートにタスクを自動化するWSH(Windows Script Host)の領域に足を踏み入れようとしているあなたへ。
今回は、プロの現場でも絶対に避けて通れない「環境別挙動切り替え」のテクニックを伝授します。
「開発環境ではテスト用のデータベースに繋ぎたいけれど、本番環境では絶対に本番用データベースを叩かせたい。でも、スクリプトのファイル自体は何個もコピーしたくない……」
こんな悩み、ありませんか?
ここをクリアすれば、あなたも単なる「コードを動かせる人」から「堅牢なシステムを設計できるエンジニア」の仲間入りです。さあ、一緒にスマートな自動化の扉を開きましょう!
—
1. なぜ「環境別切り替え」が必要なのか?
私たちが書くスクリプト(VBScript)は、最終的に「開発環境(DEV)」「テスト環境(STG)」「本番環境(PROD)」といった異なるステージで動くことになります。
もし、スクリプトの中に接続先やファイルパスを直接(ハードコーディングで)書き込んでいたらどうなるでしょう?
- うっかりミス(ヒューマンエラー): テストのつもりが本番データを書き換えてしまった!
- メンテナンス地獄: 環境が変わるたびにスクリプトの中身を書き換えて再配布する手間。
これらをスマートに解決するのが、「OSの環境変数」を読み取って、VBScript自身に今の環境を判断させるというアプローチです。
—
2. 秘密兵器:`WScript.Shell.Environment` の正体
VBScriptでOSの環境変数を扱うには、`WScript.Shell` という万能オブジェクトの `Environment` コレクションを使用します。
まずは、頭の中で次のようなイメージを持ってください。
[Windows OS]
└─ 環境変数 “AppEnv” をチェック!
├─ “DEV” ならば ➔ 【開発用設定】をロード
├─ “STG” ならば ➔ 【テスト用設定】をロード
└─ “PROD” ならば ➔ 【本番用設定】をロード
VBScriptの世界では、環境変数の取得はたったこれだけです。
Set objShell = WCreateObject(“WScript.Shell”)
‘ プロセス環境変数から “AppEnv” というキーの値を読み取る
targetEnv = objShell.Environment(“Process”)(“AppEnv”)
—
3. 【実践】環境自動切替マルチスクリプト
それでは、現場でそのままコピー&ペーストして使える実用的なコードをお見せします。
デスクトップなどに `deploy.vbs` という名前で保存して動かせるコードです。
‘ =================================================================0
‘ スクリプト名: EnvironmentSwitcher.vbs
‘ 概要: 実行環境(DEV/STG/PROD)を自動判定し、接続先等を動的に切り替えるサンプル
‘ =================================================================0
Option Explicit
Dim objShell, targetEnv
Dim dbConnectionString, logOutputPath
‘ 1. WScript.Shell オブジェクトの生成
Set objShell = CreateObject(“WScript.Shell”)
‘ 2. 環境変数 “APP_ENV” から現在の環境を取得
‘ ※あらかじめWindows側で設定しておくか、テスト用にデフォルト値をフォールバックさせます
targetEnv = objShell.Environment(“Process”)(“APP_ENV”)
‘ 環境変数が未設定の場合の安全策(ここではデバッグ用に “DEV” とみなす)
If targetEnv = “” Then
targetEnv = “DEV”
WScript.Echo “[WARN] APP_ENV が未設定です。デフォルトの ‘DEV’ 環境として動作します。”
End If
‘ 3. 環境に応じたパラメータの動的切り替え(ここがキモ!)
Select Case UCase(targetEnv)
Case “DEV”
dbConnectionString = “Provider=SQLOLEDB;Server=dev-db.local;Database=TestDB;UID=sa;PWD=dev_pass;”
logOutputPath = “C:\Logs\Dev\”
Case “STG”
dbConnectionString = “Provider=SQLOLEDB;Server=stg-db.local;Database=StageDB;UID=app;PWD=stg_pass;”
logOutputPath = “D:\AppLogs\Stg\”
Case “PROD”
dbConnectionString = “Provider=SQLOLEDB;Server=prod-db.corp;Database=MainDB;UID=app;PWD=secure_pass;”
logOutputPath = “\\server\shares\Logs\Prod\”
Case Else
‘ 想定外の環境値が入っていた場合は安全のため即座に停止する
WScript.Echo “[ERROR] 不明な環境変数が指定されています: ” & targetEnv
WScript.Quit 99
End Select
‘ 4. 実行結果の確認(実際の現場ではここにメイン処理が入ります)
WScript.Echo “==========================================”
WScript.Echo ” 現在の稼働環境 : ” & UCase(targetEnv)
WScript.Echo ” 接続先DB : ” & dbConnectionString
WScript.Echo ” ログ出力先 : ” & logOutputPath
WScript.Echo “==========================================”
‘ オブジェクトの解放(メモリ管理の基本ですね)
Set objShell = Nothing
—
4. コードのここがポイント!知っておくべき極意
上記のコードで、VBScriptを扱う上で知っておくべき大切なポイントがいくつか隠されています。
① `Option Explicit` はエンジニアの良心
コードの最上部に書いた `Option Explicit`。これ、絶対に省略しないでください。
VBScriptはデフォルトでは変数の宣言なしで使えてしまいます(タイポしても新しい変数として勝手に作られてしまう)。これによる「変数名の打ち間違い地獄」を防ぐために、変数の宣言を強制するのがこのお呪いです。プログラマとしての第一歩はここからです。
② `UCase` で大文字小文字の揺れを防ぐ
`Select Case UCase(targetEnv)` の部分です。
Windowsを使う人によって「dev」「DEV」「Dev」と入力の仕方がバラバラになることがあります。あらかじめ `UCase` 関数で大文字に統一してあげることで、こうした些細なバグを未然に防ぐことができます。
—
5. 陥りやすい罠:「環境変数が反映されない?」エラー
ここで、初心者が100%ハマる落とし穴について解説します。
> 現象: コマンドプロンプトで `set APP_ENV=PROD` と実行してからVBScriptを叩いたのに、なぜか “DEV” になってしまう!
原因:
Windowsの環境変数には「ユーザー環境変数」「システム環境変数」、そしてスクリプトから参照している「プロセス環境変数」のスコープ(有効範囲)があります。
コマンドプロンプトを新しく開いたり、VBScriptをダブルクリックで直接起動した場合、親プロセスの環境変数がうまく引き継がれていないことがあります。
確実なテスト方法:
動作テストを行うときは、あらかじめコマンドプロンプトを立ち上げ、次のように1つのウィンドウ内で環境変数を設定して即座に実行してください。
:: コマンドプロンプトでの実行例
set APP_ENV=STG
cscript EnvironmentSwitcher.vbs
これなら確実に `STG` 環境として判定されます。
—
おわりに:ここをクリアすればVBScriptの基本はバッチリ!
お疲れ様でした!
今回は `WScript.Shell.Environment` を使った、実務で今すぐ使える環境別の自動切り替えロジックを解説しました。
「ハードコーディングを排除し、環境外部から状態を注入して挙動を変える」という考え方は、VBScriptだけでなく、Python、PowerShell、JavaやC#といったあらゆるプログラミング言語に通じる普遍的なエンジニアリングのスキルです。
ここをクリアしたあなたなら、もうマクロの記録の枠を超えた「自動化エンジニア」の背中が見えています。
ぜひ、明日の業務効率化にこの知見を役立ててくださいね。それでは、また次の冒険でお会いしましょう!
