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

时间:2010-07-20 09:20:36

标签: batch-file cmd

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

4 个答案:

答案 0 :(得分:78)

这就是我找到的(^^)

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

答案 1 :(得分:59)

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

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