Ответ 1
То, что я нашел (^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
Когда у меня есть setlocal ENABLEDELAYEDEXPANSION
, установленный в cmd script, есть ли способ, которым я могу избежать a! что я хочу использовать в качестве параметра для команды?
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang!
echo I still want to go out with a bang^!
То, что я нашел (^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
Дополнительное примечание к ответа 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^!"
- OUTPUT -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
Спасибо. Чтобы добавить к этой ценной точке, если один script содержит переменную, значение которой содержит "!", То следующий подход будет отображать это значение как есть:
@echo off SETLOCAL EnableDelayedExpansion set /P omg=Enter a value that contains an exclamation-point: echo Traditional: %omg% echo Alternative: !omg! pause
Ниже приведен пример, как мы можем использовать переменную восклицательного знака в состоянии DISABLEDELAYEDEXPANSION и ENABLEDELAYEDEXPANSION.
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!