batファイルからシステム環境変数を更新する
経緯
様々なJavaのプロジェクトを並行して進めている時にJavaのバージョンが異なるため、実行する時にJAVA_HOME
を都度切り替えていたのが面倒でした。
ということで、画面左下の【スタート】から【システム環境変数】と入力し、環境変数を書き換えるという手順をbatファイル化できればゴールです。
結果
こんな感じのbatファイルができました。
@echo off
setx /m JAVA_HOME "C:\tmp" > nul 2>&1
if %errorlevel% neq 0 (
Powershell Start-Process -FilePath "%0" -Verb RunAs
exit
)
set JAVA_HOME="(JAVA_HOMEに設定するpath)"
setx /m JAVA_HOME "(JAVA_HOMEに設定するpath)"
@echo;
set JAVA_HOME
@echo;
pause
説明
結果だけで終わるのも悲しいのでbatファイルの中身を説明
@echo off
batファイルを書く時に良くあるおまじないですね。
記述しなくても内容に変化はありませんが、ファイルに書かれているコマンド一つ一つを丁寧に表示されてしまいうっとうしいので無駄な出力は非表示にします。
setx /m JAVA_HOME "C:\tmp" > nul 2>&1
if %errorlevel% neq 0 (
Powershell Start-Process -FilePath "%0" -Verb RunAs
exit
)
こちらではシステム環境変数JAVA_HOME
にC:\tmp
の設定を試行します。
下のif文でerrorlevel(終了コード)を判定し、0(正常終了)
以外であれば失敗しているため、管理者権限で再実行します。
set JAVA_HOME="(JAVA_HOMEに設定するpath)"
setx /m JAVA_HOME "(JAVA_HOMEに設定するpath)"
このbatファイルの肝である環境変数への設定です。
set
で設定した値は永続的に保持されず、一時的な変数となってしまうため、システム環境変数に設定する場合はsetx
を使います。
オプションに指定している\m
はsetx
のヘルプを参照すると以下のように記述されています。
変数をシステム全体 (HKEY_LOCAL_MACHINE)の環境で設定することを指定します。
既定では、HKEY_CURRENT_USER 環境で変数を設定するように設定されています。
システム全体の環境、つまりはシステム環境変数に設定することを表しています。
因みにオプションを外してsetx JAVA_HOME "(JAVA_HOMEに設定するpath)"
とした場合はユーザー環境変数へJAVA_HOME
が設定されます。
@echo;
set JAVA_HOME
@echo;
@echo;
や@echo+
というように、@echo
の後ろに記号を付与するとコマンドプロンプトでは改行を表示することができます。
(一部例外があるようなので使える記号は確認しておきましょう)
set JAVA_HOME
で今回設定した環境変数の出力をします。
前のブロックで一時的な変数としてset
を実行している理由は、ここで確認用に環境変数を表示させるようにしているためでした。
確認が不要であればこの部分と合わせてset
側も消してしまいましょう。
pause
言わずもがな、な一時停止です。記述しなくても問題ありません。
記述していない場合は、batファイルの中身が少ないため、コマンドプロンプトが一瞬だけ表示されて消えます。
JAVA_HOME
に限らず様々な理由でシステム環境変数への設定を行う場面があると思いますので、一つの案として参考にしてみてください。
Discussion