怎么才能摆脱感叹号呢!在cmd脚本中?

问题描述 投票:0回答:4

当我在 cmd 脚本中设置

setlocal ENABLEDELAYEDEXPANSION
时,有什么方法可以逃避 !我想用作命令的参数?

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang!
echo I still want to go out with a bang^!
batch-file cmd
4个回答
97
投票

这就是我发现的(^^)

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

76
投票

FrVaBeanswer的补充说明。

通常

^^!
有效,但在引号中您只需要
^!
即可。

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^!"

-- 输出 --

DisableDelayedExpansion
caret^       "caret^"
caret^ bang! "caret^ bang!"

EnableDelayedExpansion
caret^       "caret^"
caret^ bang! "caret^ bang!"

18
投票

要在启用延迟扩展的情况下批量使用感叹号,您必须首先将感叹号添加到禁用它的变量中。请参阅以下具有

DISABLEDELAYEDEXPANSION
ENABLEDELAYEDEXPANSION
状态的示例。

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

6
投票

谢谢。为了增加这一点,如果一个脚本包含一个其值包含“!”的变量,那么以下方法将按原样呈现该值:

@回声关闭
SETLOCAL 启用延迟扩展
set /P omg=输入包含感叹号的值:
echo 繁体:%omg%
echo 替代方案:!天啊!
暂停
© www.soinside.com 2019 - 2024. All rights reserved.