我如何才能逃脱感叹号!在cmd脚本中?


77

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


11

请在下面的示例中找到如何在DISABLEDELAYEDEXPANSIONENABLEDELAYEDEXPANSION状态下使用感叹号标记。

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

最佳答案!这解决了在需要DELAYEDEXPANSION的脚本中的使用。
JasonXA

太过分了 内存需求无处不在,但我经常使用它而没有不良影响。除非您能真正做出贡献,否则请不要胡言乱语。
JasonXA

我实际上像您一样编写了我的代码,然后以为“这将无法正常工作,因为!将在启用delayExpansion的情况下丢失!”,在整个互联网上搜索了一个解决方案,然后进入此处,阅读了最后一个答案,发现我的代码可以一直都在工作,我只是没有意识到它只需要更换一次...非常感谢^!^!; D
timlg07

88

那就是我发现的(^^)

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

2
顺便说一句,如果您必须在变量内替换感叹号,您将如何处理?
crosenblum 2012年

2
@crosenblum我建议将其作为一个独立的问题提出。比起所有SO成员,它都是可见的,并且很可能会得到答复。
FrVaBe 2012年

1
如果感叹号位于您设置/使用或传递给调用标签的变量内,则此方法(也不适用其他解决方案)将起作用,在这种情况下,我认为您会很不幸。
亚伯

65

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

通常情况下是^^!可行的,但只需引用即可^!

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

6

谢谢。更重要的是,如果一个人的脚本包含一个变量,其值包含“!”,则以下方法将按原样呈现该值:

@回声关闭
SETLOCAL EnableDelayedExpansion
set / P omg =输入一个包含感叹号的值:
回声传统:%omg%
回声替代:!omg!
暂停
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.