Ключом к ответу является тот факт, что нормальное (%
-) расширение (фаза 1) происходит за до распознавания специальных символов (в фазе 2) - см. Принятый ответ: Как интерпретирует сценарии интерпретатора команд Windows (CMD.EXE)?
Первые символы (^
) удаляются интерпретатором команд в строке
set $test_var=This is text with escaped delayed expansion syntax - ^^!$var1^^! and ^^!$var2^^!
когда завершена фаза 2, каждый экземпляр ^^
становится одним литералом ^
.Вы можете доказать это, изменив @echo off
на @echo on
, чтобы каждая проанализированная командная строка отображалась перед выполнением или когда вы помещаете следующую команду в следующую строку (спасибо пользователю jeb за подсказка ):
rem // This displays the actual content of the variable:
set $test_var
В следующей строке
echo $test_var = %$test_var%
происходит удаление оставшихся кареток, потому что - как уже было сказано - %
- сначала происходит расширение (фаза 1), в результате чего появляется командная строка типа
echo $test_var = This is text with escaped delayed expansion syntax - ^!$var1^! and ^!$var2^!
, а затем следует фаза 2, где оставшиеся каретки распознаются и удаляются, в результате чего получается окончательный текст
$test_var = This is text with escaped delayed expansion syntax - !$var1! and !$var2!
Вы можете защитить каретки (а также любые другие специальные символы) в командной строке set
при использовании цитируемого синтаксиса, например:
set "$test_var=This is text with escaped delayed expansion syntax - ^!$var1^! and ^!$var2^!"
Таким образом, вы можете сохранить одинуровень , выходящий .Однако это работает только тогда, когда включены расширения команды , но это все равно значение по умолчанию для интерпретатора команд.
Для командной строки echo
вы не можете использовать такойметод, потому что кавычки тоже стали возвращаться.
Я заметил, что вы использовали echo.
для вывода пустой строки.Вам лучше использовать echo/
или echo(
(обратитесь к внешнему ресурсу ECHO. Сбой, чтобы дать текст или пустую строку - вместо этого используйте ECHO / , чтобы выяснить, почему).
Кстати, отображаемый вами текст не соответствует реальной ситуации, потому что у вас отключено отложенное расширение .