Как я могу избежать восклицательного знака! в сценарии КМД?
когда у меня есть setlocal ENABLEDELAYEDEXPANSION установить в сценарии cmd есть ли способ избежать a ! что я хочу использовать в качестве параметра команды?
@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!"
EDITвот немного измененный пример, который лучше иллюстрирует различные перестановки escape, которые требуются, в зависимости от контекста. Единственный случай, требующий необычного экранирования, - это последний пример, когда отложенное расширение включено и существует хотя бы один
!на линии.@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!"
спасибо. Чтобы добавить к этому ценный момент, если сценарий содержит переменную, значение которой содержит "!", тогда следующий подход будет отображать это значение как есть:
@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!
Comments