当我在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^!
答案 0 :(得分:78)
这就是我找到的(^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
答案 1 :(得分:59)
通常^^!
有效,但在引号中只需要^!
。
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^!"
---- OUTPUT ------
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!"
答案 2 :(得分:6)
感谢。要添加到这个有价值的点,如果一个脚本包含一个值为“!”的变量,那么以下方法将按原样呈现该值:
@echo off SETLOCAL EnableDelayedExpansion set /P omg=Enter a value that contains an exclamation-point: echo Traditional: %omg% echo Alternative: !omg! pause
答案 3 :(得分:6)
请在下面的示例中找到我们如何在 DISABLEDELAYEDEXPANSION 和 ENABLEDELAYEDEXPANSION 状态下使用感叹号变量。
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!