35

我正在编写一个批处理文件,我需要在其中输出一个包含“!”的字符串 到另一个文件。但是当我将该字符串回显到另一个文件时,它会删除“!” 从输出。

例如:输入:

set LINE=Hi this is! output
echo !LINE!>>new_file.txt

new_file.txt 中的输出为:

Hi this is output

此外,如果输入是

set LINE=Hello!! this is output!!
echo !LINE!>>new_file.txt

new_file.txt 中的输出:

Hello

因此,它跳过了!(感叹号)从输出到 new_file。如果我使用 %LINE%,那么它只会在输出文件中显示“echo is on”。

请提出解决此问题的方法。

4

2 回答 2

22

如果您启用了延迟扩展并希望输出感叹号,则需要对其进行转义。

感叹号的转义不需要,一个或两个插入符号,具体取决于放置。

@echo off
REM No escaping required, if delayed expansion is disabled
set test1=Test1!

setlocal EnableDelayedExpansion
REM One caret required
REM Delayed expansion uses carets independent of quotes to escape the exclamation mark
set "test2=Test2^!"

REM Two carets required
REM The first caret escapes the second caret in phase2 of the parser
REM Later in the delayed expansion phase, the remaining caret escapes the exclamation mark
set test3=Test3^^!


echo !test1!
echo !test2!
echo !test3!

DOS 批处理中解释了块!var!和块之间的区别:为什么我的设置命令导致没有任何内容被存储?%var%

批处理解析器的解释可以在Windows 命令解释器 (CMD.EXE) 如何解析脚本中找到?

于 2013-01-16T09:46:06.387 回答
7

看来您SETLOCAL EnableDelayedExpansion在代码中调用了更高的位置。看看这里,看看有什么影响。

于 2013-01-16T09:04:39.007 回答