当我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^!
Run Code Online (Sandbox Code Playgroud)
FrV*_*aBe 80
这就是我发现的(^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
Run Code Online (Sandbox Code Playgroud)
jeb*_*jeb 62
通常是^^!作品,但在引号中你只需要^!代替.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Run Code Online (Sandbox Code Playgroud)
这是批处理解析器的转义机制的结果.
首先,解析器解析一行,插入符号转义下一个字符,在这种情况下,它有效&|<>()"<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^!"
Run Code Online (Sandbox Code Playgroud)
----输出------
DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
Run Code Online (Sandbox Code Playgroud)
编辑
这是一个稍微修改过的示例,可以更好地说明所需的各种转义排列,具体取决于上下文.唯一需要异常转义的情况是延迟扩展开启并且!线路上至少存在一个的最后一个示例.
@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^!"
Run Code Online (Sandbox Code Playgroud)
- 输出 -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
Run Code Online (Sandbox Code Playgroud)
小智 7
请在下面的示例中找到我们如何在DISABLEDELAYEDEXPANSION和ENABLEDELAYEDEXPANSION状态下使用感叹号变量.
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
Run Code Online (Sandbox Code Playgroud)
小智 6
谢谢.要添加到这个有价值的点,如果一个脚本包含一个值包含"!"的变量,那么以下方法将按原样呈现该值:
@echo off SETLOCAL EnableDelayedExpansion set /P omg=Enter a value that contains an exclamation-point: echo Traditional: %omg% echo Alternative: !omg! pause