我一直在写一些批处理文件,然后我看到了这个用户指南,它提供了很多信息。它告诉我的一件事是,行不仅可以用REM进行注释,还可以用::进行注释。它说:

批处理代码中的注释可以通过使用双冒号来生成,这比使用REM命令更好,因为标签在重定向符号之前被处理。::<remark>不会引起任何问题,但是rem <remark>会产生错误。

那么,为什么我看到的大多数指南和示例都使用REM命令呢?::适用于所有版本的Windows吗?


当前回答

REM是在批处理文件中嵌入注释的有文档支持的方法。


::本质上是一个永远不能跳转到的空白标签,而REM是一个实际的命令,它什么也不做。在这两种情况下(至少在Windows 7上),重定向操作符的存在都不会导致问题。

然而,在某些情况下,::在块中表现不佳,不是作为标签而是作为某种驱动器号进行解析。我不太清楚具体在哪里,但仅此一点就足以让我只使用快速眼动。它是在批处理文件中嵌入注释并得到支持的方法,而::仅仅是特定实现的工件。


下面是一个例子,其中::在FOR循环中产生一个问题。

这个例子在桌面上的test.bat文件中不起作用:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

虽然这个例子将正确地作为注释工作:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

问题似乎出现在试图将输出重定向到文件时。我的最佳猜测是,它将::解释为一个名为:echo的转义标签。

其他回答

好问题……我也一直在寻找这个功能…

经过几次测试和技巧,似乎更好的解决方案是更明显的…

——>最好的方法,我发现这样做,防止解析器完整性失败,是重用REM:

echo this will show until the next REM &REM this will not show

你也可以使用多行“NULL LABEL”技巧… (不要忘记行末的^以保持连贯性)

::(^
this is a multiline^
comment... inside a null label!^
dont forget the ^caret at the end-of-line^
to assure continuity of text^ 
)

该页告诉我们,在某些限制条件下,使用“::”会更快 只是选择时要考虑的一点

另一种替代方法是将注释表示为一个总是展开为零的变量展开。

变量名不能包含=,除了未记录的动态变量,比如 %=ExitCode%和%=C:%。任何变量名都不能在第一个位置后面包含=。所以我有时会使用下面的代码在括号内包含注释:

::This comment hack is not always safe within parentheses.
(
  %= This comment hack is always safe, even within parentheses =%
)

它也是一种合并内联注释的好方法

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

前导=不是必须的,但我喜欢它的对称性。

有两个限制:

1)注释不能包含%

2)评论不能包含:

REM是在批处理文件中嵌入注释的有文档支持的方法。


::本质上是一个永远不能跳转到的空白标签,而REM是一个实际的命令,它什么也不做。在这两种情况下(至少在Windows 7上),重定向操作符的存在都不会导致问题。

然而,在某些情况下,::在块中表现不佳,不是作为标签而是作为某种驱动器号进行解析。我不太清楚具体在哪里,但仅此一点就足以让我只使用快速眼动。它是在批处理文件中嵌入注释并得到支持的方法,而::仅仅是特定实现的工件。


下面是一个例子,其中::在FOR循环中产生一个问题。

这个例子在桌面上的test.bat文件中不起作用:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

虽然这个例子将正确地作为注释工作:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

问题似乎出现在试图将输出重定向到文件时。我的最佳猜测是,它将::解释为一个名为:echo的转义标签。

James K,我很抱歉我说错了很多。我所做的测试如下:

@ECHO OFF
(
  :: But
   : neither
  :: does
   : this
  :: also.
)

这符合您对交替的描述,但失败于“)was unexpected at This time.”错误消息。

我今天做了一些进一步的测试,发现交替不是关键,但关键似乎是有偶数行,没有任何两行在一行以双冒号(::)开始,也没有双冒号结束。考虑以下几点:

@ECHO OFF
(
   : But
   : neither
   : does
   : this
   : cause
   : problems.
)

这个工作!

但还要考虑到这一点:

@ECHO OFF
(
   : Test1
   : Test2
   : Test3
   : Test4
   : Test5
   ECHO.
)

当以命令结尾时,注释数量为偶数的规则似乎并不适用。

不幸的是,这只是奇怪的足够,我不确定我想要使用它。

实际上,最好的解决方案,也是我能想到的最安全的解决方案是,如果一个像notepad++这样的程序将REM读取为双冒号,然后在保存文件时将双冒号写入REM语句。但我不知道这样一个程序,我也不知道任何notepad++的插件,这样做。