То, что происходит, заключается в том, что подстановка переменной выполняется при чтении строки. То, что вы не принимаете во внимание, это то, что:
if 1==1 (
set _=Baz
echo %_%
)
- это одна"линия", несмотря на то, что вы думаете. Расширение "%_%"
выполняется перед оператором set
.
Вам нужно отсроченное расширение. Почти каждый из моих командных сценариев начинается с "setlocal enableextensions enabledelayedexpansion"
, чтобы использовать всю мощь cmd.exe
.
Итак, моя версия сценария будет:
@echo off
setlocal enableextensions enabledelayedexpansion
set _=Foo
echo !_!
set _=Bar
if 1==1 (
set _=Baz
echo !_!
)
endlocal
Это генерирует правильный "Foo", "Baz"
вместо "Foo", "Bar"
.