我怎样才能避免感叹号! 在cmd脚本?

当我有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^! 

这就是我发现(^^)

 @echo off setlocal ENABLEDELAYEDEXPANSION echo I want to go out with a bang^^! 

对FrVaBe的回答再补充一点。

通常^^! 作品,但在报价中,你只需要^! 代替。

 echo I want to go out with a bang^^! echo He said "Bang^!" 

这是批parsing器的转义机制的结果。

首先parsing器parsing一行,并且脱字符转义下一个字符,在这种情况下它对&|<>()"<linefeed>有影响,但只在引号之外,因为引号内部的所有字符都是”正常“并且脱字符本身没有效果。

随着延迟扩展一个额外的parsing步骤如下,还有一个逃脱字符为下一个字符,但只影响!^ ,并且在这个parsing步骤中引号被忽略。 这个额外的步骤只会被执行,如果至less有一个! 在线。

 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!" 

编辑

这里有一个稍微修改的例子,可以更好地说明所需的各种换码排列,具体取决于上下文。 唯一需要不寻常转义的情况是最后一个延迟扩展的例子,至less存在一个! 在线上。

 @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!" 

谢谢。 为了增加这个有价值的观点,如果一个脚本包含一个variables,其值包含一个“!”,那么下面的方法将按原样呈现该值:

 @echoclosures
 SETLOCAL EnableDelayedExpansion
 set / P omg =input一个包含感叹号的值:
 echo传统:%omg%
回声另类:!omg!
暂停

请在下面的示例中find如何在DISABLEDELAYEDEXPANSIONENABLEDELAYEDEXPANSION状态下使用感叹号variables。

 @echo off setlocal DISABLEDELAYEDEXPANSION set DB_password=encrypt!Pws echo %DB_password% SETLOCAL ENABLEDELAYEDEXPANSION echo !DB_password!