Логически ваш ошибочный код равен
setlocal enableDelayedExpansion
(
set VAR1=success
set VAR2=VAR1
set VAR3=!%VAR2%!
echo VAR3=!VAR3!
)
Как уже указывалось в предыдущих ответах и комментариях, вы не можете присвоить значение VAR2 и затем получить доступ к значению, используя% VAR2% в том же кодовом блоке, потому что% VAR2% раскрывается во время фазы синтаксического анализа блок кода, в этот момент значение не то, что вы хотите (вероятно, не определено).
Но вам нужен второй уровень расширения в дополнение к! VAR2! чтобы получить результат, который вы хотите. Я знаю три решения.
1) Это решение работает, но не рекомендуется, поскольку оно медленное.
setlocal enableDelayedExpansion
(
set VAR1=success
set VAR2=VAR1
call set VAR3=%%!VAR2!%%
echo VAR3=!VAR3!
)
Перед выполнением CALL каждый %% уменьшается до%, а! VAR2! становится VAR1.
Таким образом, вызываемый оператор становится set VAR3=%VAR1%
, а вызываемый оператор повторно анализируется на этапе расширения% var%, поэтому вы получаете желаемый результат.
НО - ЗВОНОК относительно дорог. При использовании в цикле это может привести к серьезному снижению производительности. Джеб дает хорошую демонстрацию и объяснение на Позвоните мне, или лучше избегайте звонить
1a) Существует вариант решения CALL, в котором вы вызываете подпрограмму LABELed. Поскольку подпрограмма анализируется после вызова, вы можете просто использовать set VAR3=!%VAR2%!
. Но опять же, он использует CALL, поэтому он относительно медленный и не рекомендуется.
2) Это общее решение работает и по сравнению с НАМНОГО быстрее. Он использует переменную FOR для второго уровня расширения. Это рекомендуемое решение.
setlocal enableDelayedExpansion
(
set VAR1=success
set VAR2=VAR1
for /f %%A in ("!VAR2!") do set VAR3=!%%A!
echo VAR3=!VAR3!
)
3) Если известно, что значение VAR1 является целым числом, то существует специальное решение, использующее SET /A
setlocal enableDelayedExpansion
(
set VAR1=999
set VAR2=VAR1
set /a VAR3=!VAR2!
echo VAR3=!VAR3!
)
Команда SET / A имеет собственное встроенное раскрытие переменных, которое происходит после отложенного раскрытия, и пунктуация не требуется.