Проблема в том, что set myvar=!myvar!
расширяется до set myvar=first
,
вы устанавливаете его с тем же содержимым, а затем просите echo myvar:!myvar!
показать содержимое myvar.
Я попробуюдобавить еще несколько объяснений, даже если Aacini и shf301 уже ответили на вопрос.
Оба показали двойное расширение с конструкцией !%var%!
, и Аасини объяснил, почему оно может работать и почему не работает обратная версия %!var!%
.
ИМХО, есть четыре разныхрасширения.
Отсроченное расширение:
Как объяснил Аасини, отложенное расширение безопасно для любых специальных символов в содержимом (оно может обрабатывать ВСЕ символы от 0x01 до 0xFF).
Процентное расширение:
Процентное расширение не может обрабатывать или удалять некоторые символы (даже с экранированием).
Это может быть полезно для простого содержимого, поскольку оно может расширятьсяпеременные после endlocal
барьера.
setlocal
set "myVar=simple content"
(
endlocal
set result=%myVar%
)
Расширение FOR-Loop-Parameters:
Безопасно, если задержанное расширение отключено, иначе фаза отложенного расширениявыполняется после раскрытия переменных %% a.
Это может быть полезно, так как может расширять переменные после endlocal
барьера
setlocal EnableDelayedExpansion
set "var=complex content &<>!"
for /F "delims=" %%A in ("!var!") DO (
endlocal
set "result=%%A"
)
SET Расширение:
set var
расширяет также переменную, и она всегда безопасна и работает независимо от режима отложенного расширения.
Aacini только что объяснил, как работает конструкция call %%%var%%%
, я только хочу дать несколько дополнительных замечаний.
call
можно наращивать, вы можете использовать многие из них, и каждый перезапускает анализатор.
set "var=%%var%%#"
call call call call call echo %var%
приводит к %var%######
Но call
имеет много недостатков / побочных эффектов!
Каждый вызов удваивает все кареты ^
Вы можете сказать: «Привет, я»Я проверил это, и я не вижу никакого удвоения "
call call call call echo ^^
результат ^
Тем не менее, это правда, но в основном это скрыто, так как каждый перезапуск также имеет фазу специального символа, гдеCarets экранирует следующий символ, но вы можете увидеть эффект удвоения с
call call call call echo "^^"^^
result "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"^
Даже если расширение вызова перезапускает анализатор, вы никогда не сможете использовать отложенное расширение влюбая фаза (только в первой).
call
перестает работать, если обнаруживает неэкранированные специальные символы.
echo you ^& me
call echo you & me
call echo you ^& me
call echo you ^^& me
call echo you ^^^& me
Только первые результаты на выходе you & me
, все остальные сбои.
Другая проблема заключается в том, что вызов очень медленный, call set var=content
примерно в 50 раз медленнее set var=content
, причина в том, что вызов пытается запустить внешнюю программу.
@echo off
setlocal
(
echo echo *** External batch, parameters are '%%*'
) > set.bat
set "var="
call set var=hello
set var
Iнадеюсь, что это будет немного интересно ...
И если вы хотите углубиться в подробности, вы можете прочитать ЗВОНИТЕ меня, или лучше избегайте звонков
и Как работает интерпретатор команд Windows(CMD.EXE) разбирать скрипты?