当我在 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^!
这就是我发现的(^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
通常
^^!
有效,但在引号中您只需要 ^!
即可。
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!"
要在启用延迟扩展的情况下批量使用感叹号,您必须首先将感叹号添加到禁用它的变量中。请参阅以下具有
DISABLEDELAYEDEXPANSION
和 ENABLEDELAYEDEXPANSION
状态的示例。
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
谢谢。为了增加这一点,如果一个脚本包含一个其值包含“!”的变量,那么以下方法将按原样呈现该值:
@回声关闭 SETLOCAL 启用延迟扩展 set /P omg=输入包含感叹号的值: echo 繁体:%omg% echo 替代方案:!天啊! 暂停