Подтвердить что ты не робот

Как я могу избежать восклицательного знака! в сценариях cmd?

Когда у меня есть 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^!
4b9b3361

Ответ 1

То, что я нашел (^^)

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!

Ответ 2

Дополнительное примечание к ответа 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!"

Ответ 3

Спасибо. Чтобы добавить к этой ценной точке, если один script содержит переменную, значение которой содержит "!", То следующий подход будет отображать это значение как есть:

@echo off
SETLOCAL EnableDelayedExpansion
set /P omg=Enter a value that contains an exclamation-point:
echo Traditional: %omg%
echo Alternative: !omg!
pause

Ответ 4

Ниже приведен пример, как мы можем использовать переменную восклицательного знака в состоянии DISABLEDELAYEDEXPANSION и ENABLEDELAYEDEXPANSION.

@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!