Дополнительное замечание к ответу из FrVaBe .
Обычно ^^!
работает, но в кавычках вам нужен только ^!
.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Это результат механизма экранирования пакетного парсера.
Сначала синтаксический анализатор анализирует строку, и символ каретки избегает следующего символа, в этом случае он действует на &|<>()"<linefeed>
, но только вне кавычек, поскольку внутри кавычек все символы "нормальны" и сама каретка не имеет никакого эффекта
С отложенным расширением следует дополнительный шаг разбора, есть символ каретки и escape-символ для следующего символа, но он влияет только на !
и ^
, и кавычки игнорируются на этом этапе анализа.
Этот дополнительный шаг будет выполнен, только если в строке есть хотя бы один !
.
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo one caret^^
echo one caret^^ bang! "boom^!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo one caret^^
echo none caret^^ bang^^! "boom^!"
---- ВЫХОД ------
DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
EDIT
Вот слегка измененный пример, который лучше иллюстрирует различные требуемые перестановки в зависимости от контекста. Единственный случай, когда требуется необычное экранирование, - это последний пример, когда включено отложенное расширение, и в строке присутствует хотя бы один !
.
@echo off
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo caret^^ "caret^"
echo caret^^ bang! "caret^ bang!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo caret^^ "caret^"
echo caret^^^^ bang^^! "caret^^ bang^!"
- ВЫХОД -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"