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

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

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


РЕДАКТИРОВАТЬ

Вот слегка измененный пример, который лучше иллюстрирует различные требуемые перестановки в зависимости от контекста. Единственный случай, который требует необычного экранирования, - это последний пример, когда включено отложенное расширение и существует хотя бы один! на линии.

@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!"
 jeb10 янв. 2013 г., 17:59
@dbenham спасибо за дополнительные примеры

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

@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
 timlg0721 окт. 2018 г., 20:31
Я на самом деле написал свой код, как твой, потом подумал: «Это не может работать, потому что! Будет потеряно с включенным delayedExpansion», искал решение во всем Интернете, приземлился здесь, прочитал последний ответ и узнал, что мой код будет иметь работал все время, я просто не осознавал, что его заменяют только один раз ... Большое спасибо ^! ^! ; D
 JasonXA07 июн. 2017 г., 10:51
Лучший ответ! Это решает использование в сценариях, где требуется DELAYEDEXPANSION.
 JasonXA10 янв. 2018 г., 05:36
Это аберрирующее. Нигде в требованиях нет проблемы с памятью, и все же я часто использую ее без вреда для здоровья. Если вы действительно не можете внести свой вклад, держите свою глупость при себе.
 Lockszmith26 сент. 2017 г., 16:47
На самом деле - не очень хороший ответ, я бы предложил удалить. Причина: SETLOCAL стоит много памяти, и вы хотите использовать его как можно меньше.

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

@echo off
SETLOCAL EnableDelayedExpansion
set /P omg=Enter a value that contains an exclamation-point:
echo Traditional: %omg%
echo Alternative: !omg!
pause
Решение Вопроса

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

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
 FrVaBe12 нояб. 2012 г., 09:44
@crosenblum Я бы порекомендовал задать это как собственный вопрос. Чем это будет для всех членов SO и будет, скорее всего, ответом.
 Andy Morris20 июл. 2010 г., 11:32
Потрясающе, спасибо
 crosenblum12 нояб. 2012 г., 02:04
Кстати, если бы вам пришлось заменить восклицательный знак внутри переменной, как бы вы это сделали?
 Abel28 сент. 2017 г., 05:57
Это (как и другие решения) будет работать, если восклицательный знак находится внутри переменной, которую вы устанавливаете / используете или передаете метке вызова, и в этом случае я думаю, что вам не повезет.

Ваш ответ на вопрос