Правила пакетного удаления довольно неприятны, но поведение полностью предсказуемо, если вы знаете правила.
Информация, необходимая для понимания проблемы, доступна в разделе Как интерпретатор команд Windows (CMD) .EXE) разбирать скрипты? на этапах 1, 2, 5 и 6 принятого ответа. Но удачи, поглощая эту информацию в ближайшее время: -)
Есть две фундаментальные проблемы дизайна, которые приводят к вашей проблеме: - Фаза 6 удваивает все каретки, а затем перезапускает фазу 2 (фактически фазы 1, 1.5 и 2). ). - Но фаза 2 требует & быть экранирована как ^ &. Обратите внимание, что это должен быть один ^, а не удвоенный!
Единственный способ получить ваш подход к работе - ввести ^ после удвоения каретки фазы 6.
@echo off
setlocal enableDelayedExpansion
set "ESC=^"
rem Calling with delayed expansion value
set "val=with%%ESC%%&ersand"
call :Output !val!
rem Calling with a string literal
call :Output with%%ESC%%^&ersand
exit /b
:Output
set "line=%1"
echo Called: !line!
goto :eof
ES C определено для хранения ^. Первый раунд фазы 1 расширяет %% ESC %% до% ESC%, второй раунд фазы 1 (инициированный фазой 6) расширяет% ESC% до ^
Это все практически нецелесообразно, особенно если вы не Не знаю, каким будет содержимое.
Единственная разумная стратегия для надежной передачи любого значения в процедуру CALLed - это передача по ссылке. Передайте имя переменной, содержащей строковое значение, и разверните это значение в своей подпрограмме, используя отложенное расширение.
@echo off
setlocal enableDelayedExpansion
set "val=with&ersand"
call :Output val
exit /b
:Output
set "line=!%~1!"
echo Called: !line!
exit /b