当我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^!
当我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^!
Answers:
请在下面的示例中找到如何在DISABLEDELAYEDEXPANSION和ENABLEDELAYEDEXPANSION状态下使用感叹号标记。
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
那就是我发现的(^^)
@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!"