我一直在写一些批处理文件,然后我看到了这个用户指南,它提供了很多信息。它告诉我的一件事是,行不仅可以用REM进行注释,还可以用::进行注释。它说:
批处理代码中的注释可以通过使用双冒号来生成,这比使用REM命令更好,因为标签在重定向符号之前被处理。::<remark>不会引起任何问题,但是rem <remark>会产生错误。
那么,为什么我看到的大多数指南和示例都使用REM命令呢?::适用于所有版本的Windows吗?
我一直在写一些批处理文件,然后我看到了这个用户指南,它提供了很多信息。它告诉我的一件事是,行不仅可以用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++的插件,这样做。