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