ページ

2015年12月26日土曜日

不思議な 遅延環境変数 バッチファイル

不思議な %パーセント記号 と!エクスクラメーション(感嘆符)

遅延環境変数の挙動をECHOを使って確認していたところ。
まったく解決できなかったこと。

@echo off
set par=%%%%
echo %par%i ; %%%%i
setlocal enabledelayedexpansion
set num=0
for /l %%i in (1,1,3) do (
set /a num+=%%i
echo !par!i = %%i ; %par%i = %%i ; %%%%i = %%i ; %%num%% = %num% ; !num! = !num!
)
echo %par%i ; %%%%i
Endlocal

実行結果

%%i ; %%i
%%i = 1 ; %1 = 1 ; %1 = 1 ; %num% = 0 ; !num! = 1
%%i = 2 ; %2 = 2 ; %2 = 2 ; %num% = 0 ; !num! = 3
%%i = 3 ; %3 = 3 ; %3 = 3 ; %num% = 0 ; !num! = 6
%%i ; %%i

疑問1.「%」自体をECHOしたい場合は %% ってしますよね。
カッコ内が実行前に 1行に解釈される事までは理解したはずだった。

カッコ前、後でのECHO(予定通りの出力結果)
echo %par%i ; %%%%i
結果 → %%i ; %%i

カッコ内でのECHO
echo %par%i ; %%%%i
結果 → %1 ; %1


最初の行解釈で
echo !par!i = %i ; %%i = %i ; %%i = %i ; %num% = 0 ; !num! = !num!
に変換されて

途中の行解釈では
echo !par!i = 1 ; %1 = 1 ; %1 = 1 ; %num% = 0 ; !num! = !num!

かと言って
「%%%%%%%%i」 と設定しても 「%%%1」に変換される始末。


結果としては。カッコ内では遅延環境変数になる 「!」を使えば思惑通りの結果が出ました。

疑問2.じゃあ「!」はどうやって出力するのか?
・「!!」では意味が無い。
・変数に突っ込んでも表示がされない。

1時間ほど悩んであきらめました。苦肉の策が全角の「!」

setlocal disabledelayedexpansion

として、
遅延環境変数を無効にすれば表示はされますが、そもそもの意味がなくなりますからね。

0 件のコメント:

コメントを投稿