@echo off
set test=%1
if "%1"=="" (
set test=default
echo %test%
) else (
set test=%1
echo %test%
)
テスト:
test.bat
出力:
ECHO is off
問題:「デフォルト」文字列を変数「テスト」に値として割り当てることができません。テスト文字列の値はまだ%1であり、値がないことがわかりました
@echo off
set test=%1
if "%1"=="" (
set test=default
echo %test%
) else (
set test=%1
echo %test%
)
テスト:
test.bat
出力:
ECHO is off
問題:「デフォルト」文字列を変数「テスト」に値として割り当てることができません。テスト文字列の値はまだ%1であり、値がないことがわかりました
これは標準的なバッチ初心者のバグです。パーセント拡張は、期待どおりに括弧内で機能しません。ブロック全体が解析されると、行が実行される前に展開されます。
したがって%test%
、ブロックに入る前の値であるゼロに展開されます。
!test!
解決策は、解析時間ではなく実行時に拡張されるため、ここで遅延拡張を使用することです。
@echo off
setlocal EnableDelayedExpansion
set test=%1
if "%1"=="" (
set test=default
echo !test!
) else (
set test=%1
echo !test!
)
私はそれがそのように機能することに気づいていませんでしたが、内部ブロックで変更された値が伝播されないというスコープの問題のようです。以下は正常に機能しているようです。
@echo off
if "%1"=="" (
set test=default
) else (
set test=%1
)
echo %test%