Как я могу избежать восклицательного знака!в скриптах cmd? - PullRequest
69 голосов
/ 20 июля 2010

Когда я установил setlocal ENABLEDELAYEDEXPANSION в сценарии cmd, есть ли способ избежать а! что я хочу использовать в качестве параметра команды?

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

Ответы [ 4 ]

78 голосов
/ 20 июля 2010

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

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
59 голосов
/ 11 апреля 2011

Дополнительное замечание к ответу из 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!"
7 голосов
/ 08 июня 2015

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

@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
6 голосов
/ 27 июня 2012

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

@echo off
SETLOCAL EnableDelayedExpansion
set /P omg=Enter a value that contains an exclamation-point:
echo Traditional: %omg%
echo Alternative: !omg!
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...