文字回显“on”的字面意思

4

我正在编写一个Windows CMD批处理文件,该文件(为简化目的)应该回显此文件的每一行:

Flash
your
lights
on 
and
off

问题出在第四个和第六个单词,会导致运行echo onecho off,但实际上并没有将文本输出,而是仅仅设置了echo的状态为ON和OFF。
for /F %%a in (DataFile.txt) do echo %%a

输出结果如下:
Flash
your
lights
and

有没有一种方式可以直接输出文本 onoff


你尝试过用引号将 %%a 包围起来吗? - Matt Johnson
这只是在每个单词周围加上引号。然后它输出“on”和“off”,但所有额外的引号是一个新问题。 - abelenky
使用 echo(%%a(这种语法看起来很奇怪,但是这是唯一安全的方法来逐字输出每个文本,甚至包括 /?)... - aschipfl
@aschipfl:可以的!有什么参考或解释吗?如果你把这个作为答案,我会点赞并接受的。 - abelenky
2
即使使用echo(%%a,您仍然会遇到空行或以;开头的行的问题,它们将被删除。当启用延迟扩展时,!和有时^符号也会被删除。解决这两个问题的方法是Jonas的答案。 - jeb
2个回答

5

根据DosTips.com上的这篇文章,输出任何文本的唯一安全方式是使用奇怪的语法echo(。因此,对于你的命令行:

for /F %%a in (DataFile.txt) do echo(%%a

常用的语法是echo,但如果当前工作目录中存在一个名为echo(无扩展名)的文件,则会失败。
有时候使用echo/的语法会失败,如果你尝试输出以问号开头的字符串(因为/后面跟着?会被解释为命令显示帮助文本的/?选项)。


2

试试这个:

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %userprofile%\Desktop\DataFile.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)
Pause

请查看此链接
在你所做的上下文中,“on”和“off”是不能用的,因为它们是所谓的保留字。它们被用作@echo off@echo on
我发布的脚本解决了这个小问题。然而,由于我对批处理的知识不够,所以我无法说明脚本是如何解决这个问题的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接