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



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

4 ответов:

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

@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>, но только вне кавычек, так как внутри кавычек все символы "нормальный" и сам каре не имеет никакого эффекта.

С задержкой расширения дополнительный шаг разбора следует, есть каретка также 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

    Ничего не найдено.