Додаткове зауваження до відповіді на FrVaBe .
Зазвичай це ^^!працює, але в лапки вам потрібно лише ^!замість цього.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Це результат механізму втечі пакетного аналізатора.
Спочатку синтаксичний аналізатор аналізує рядок, а каретка уникає наступного символу, в цьому випадку це має ефект для &|<>()"<linefeed>, але лише поза лапками, оскільки всередині лапок усі символи є "нормальними", а сама каретка не має ефекту.
При відстроченому розширенні слідує додатковий крок синтаксичного аналізу, каретка також є символом екранування для наступного символу, але лише впливає на !і ^, і лапки ігноруються на цьому кроці синтаксичного аналізу. Цей додатковий крок буде виконаний, лише якщо !в рядку є хоча б один .
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!"
РЕДАГУВАТИ
Ось трохи модифікований приклад, який краще ілюструє різні необхідні перестановки екранування, залежно від контексту. Єдиний випадок, який вимагає незвичного екранування, - це останній приклад, коли увімкнено відкладене розширення і існує принаймні одне! на лінії .
@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!"