NYAGOS 4.2.5 のリリースと環境変数の扱い
(正式版がリリースされたので改題しました)
NYAGOS 4.2.5 がリリースされた。
- Release 4.2.5_beta · nyaosorg/nyagos
- Release 4.2.5_beta2 · nyaosorg/nyagos
- Release 4.2.5_0 · nyaosorg/nyagos
以下に変更点をまとめて紹介する。
というわけで,このバージョンからバッチファイル(*.bat
, *.cmd
)実行時の環境変数の扱いが変わるようだ。
詳しくは以下を参照のこと。
個人的にはバッチファイルで環境変数が汚れるのは好みではなかったので source
コマンドのみで環境変数を変えられるという仕様は結構気に入っていたのだが,まぁいいか。
問題ない。
【追記 2018-03-31】
nyagos.option.usesource
オプションを追加していただいた。
これを false
にすれば従来どおり source
コマンドのみで環境変数を変更できる。
ホームディレクトリの .nyagos
に追記しておけばいいだろう。【追記 2018-04-18】 NYAGOS 4.2.5_1 がリリース
不具合の修正のみ。
【付録】 環境変数の汚染を防ぐには
バッチファイルで環境変数を汚さないようにするには setlocal ... endlocal
で囲めばよい1。
しかも入れ子にできる。
たとえばフィボナッチ数を数え上げる処理はこんな感じ2。
@echo off
setlocal
setlocal enabledelayedexpansion
set /a n = %~1
set /a b1 = 0
set /a b2 = 0
if %n% == 1 echo 1: %b2% && goto :end
echo 1: %b2%
set /a b2 = 1
if %n% == 2 echo 2: %b2% && goto :end
echo 2: %b2%
for /l %%i in (3, 1, %n%) do (
set /a fib = !b1! + !b2!
set /a b1 = !b2!
set /a b2 = !fib!
echo %%i: !b2!
)
:end
endlocal && set /a fib = %b2%
echo %~1th Fibonacci number is %fib%
endlocal
endlocal && set /a fib = %b2%
で setlocal ... endlocal
スコープの外に値を持ち出している点に注目。
これを実行すると以下のようになる。
C:> fibonacci.cmd 10
1: 0
2: 1
3: 1
4: 2
5: 3
6: 5
7: 8
8: 13
9: 21
10: 34
10th Fibonacci number is 34
C:> set fib
環境変数 fib が定義されていません
C:> set b2
環境変数 b2 が定義されていません
ブックマーク
- バッチファイルで、setlocal~endlocal内での変数の値を外部に引き継ぎたい! - IIJIMASの日記
- .bat(バッチファイル)のforコマンド解説。 - Qiita
- バッチファイル界の魔境『遅延環境変数』に挑む(おまけもあるよ) - Qiita
-
時々
setlocal
とendlocal
がペアになっていない記述を見かける(特に遅延環境変数の説明とか)。endlocal
がなくても別にエラーになったりはしないしちゃんと動くのだが(バッチ終了時に全スコープが閉じられるので),プログラマならスコープは正しく書こうね。 ↩︎ -
コード内の
enabledelayedexpansion
は遅延環境変数を有効にするオプション。!fib!
などがこれに該当する。for
文やif
文の( ... )
で囲まれた部分で環境変数を操作する場合に必要。遅延環境変数はsetlocal ... endlocal
スコープ内でしか有効にできない点に注意。 ↩︎