我怎么能逃避惊叹号!在cmd脚本?

And*_*ris 71 cmd batch-file

当我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)

  • 顺便说一句,如果你不得不在变量中替换感叹号,你会怎么做? (2认同)
  • @crosenblum我建议将此问题作为自己的问题.对于所有SO成员而言,它将是可见的,并且很可能得到回应. (2认同)

jeb*_*jeb 62

另外一个惊人之语的答案FrVaBe.

通常是^^!作品,但在引号中你只需要^!代替.

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

请在下面的示例中找到我们如何在DISABLEDELAYEDEXPANSIONENABLEDELAYEDEXPANSION状态下使用感叹号变量.

@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