如何在批处理/ cmd中“注释”(添加注释)?


881

我有一个批处理文件,该文件运行几个进行表修改的python脚本。

  1. 我想让用户注释掉他们不想运行的1-2个python脚本,而不是从批处理文件中删除它们(因此下一个用户知道这些脚本作为选项存在!)

  2. 我还想添加注释以引起他们的注意,特别是在运行批处理文件之前需要更新的变量。我看到我可以使用REM。但是,这似乎更多是为了在用户运行后更新进度。

是否有语法可以更适当地添加注释?


6
另请参见此处的出色答案stackoverflow.com/q/12407800/1011025
ndemou

2
您可以使用Rem Sth命令或使用该商标::: Sth
scientist_7

Answers:


879

rem命令确实是在征求意见。运行脚本后,它不会固有地更新任何人。不过,有些脚本作者可能会用它代替echo,而是使用它,因为默认情况下,批处理解释器会在处理每个命令之前将其打印出来。由于rem命令不执行任何操作,因此可以安全打印而不会产生副作用。为避免打印命令,请在命令前面加上@,或在整个程序中应用该设置,请运行@echo off。(这是echo off为了避免再打印命令;@是为了避免在回显设置生效之前打印命令。)

因此,在批处理文件中,您可以使用以下命令:

@echo off
REM To skip the following Python commands, put "REM" before them:
python foo.py
python bar.py

405
您还可以使用两个冒号“ ::”。它是在批处理文件中添加注释而不在批处理文件中显示或执行该行的两种方式之一。与REM不同,无论批处理文件中是否包含ECHO off,都不会显示此行。
Brent81

12
@ Brent81我觉得这应该是正确的答案。使用语法突出显示时,REM命令实际上不会将文本突出显示为“注释掉”。
Automatico

17
双冒号是“无效标签”;这是一篇说明它的文章,以及为什么它的性能可能比REM更好(尤其是在软盘上!),并且不能在缩进的代码块中工作(仅在第一个字符上):robvanderwoude.com/comments.php
Michael Paulukonis 2014年

4
有趣。我虽然REM是“全行注释”,而双冒号是“行注释”,例如REM This whole line is a comment @echo off :: This comment is inline
理查德·史密斯

@ Alhadis,Perl的Configure脚本是用Bourne shell编写的,而不是Windows批处理,因此它在这里有何意义?此外,冒号命令是有效的Bourne语法,不是“额外的副作用”;这就是Bourne脚本中使用它的原因#之所以使用它来进行注释#,是因为,显然,Configure打算支持的所有 shell 都不是有效的注释指示符。看到3行
罗伯肯尼迪

955

使用::REM

::   commenttttttttttt
REM  commenttttttttttt

但是(如人们所指出的):

  • 如果使用内联,则需要添加&字符:
    your commands here & :: commenttttttttttt
  • 在内部嵌套逻辑(IF/ELSEFOR循环等)中使用,REM因为::会产生错误。
  • :: 可能会在 setlocal ENABLEDELAYEDEXPANSION

79
双冒号::是最干净的.bat注释。它可以在一行的开始或中间使用!
ATSiem

10
像这样进行内联时对我不起作用。 cd "C:\Folder" ::this throws a syntax error
肖恩·罗恩

3
也失败了git add :: blah this is not a comment,“致命:pathspec'blah'与任何文件都不匹配”
Bob Stein

19
要在示例所示的同一行上添加&注释,您需要在代码和注释之间添加::。为了说明这一点,打开命令提示符并运行dir ::blah它没有列出的内容.,并与比较dir & ::blah,这确实
瑞士雷达

19
警告,::将Will脚本与setlocal ENABLEDELAYEDEXPANSION和一起使用for
Azevedo

50

不,普通的旧批处理文件REM用作注释。 ECHO是在屏幕上打印内容的命令。

要“注释”文件的各个部分,可以使用GOTO。所有这些命令/技术的示例:

REM it starts here the section below can be safely erased once the file is customised
ECHO Hey you need to edit this file before running it!  Check the instructions inside
ECHO Now press ctrl-c to interrupt execution or enter to continue
PAUSE
REM erase the section above once you have customised the file
python executed1.py
ECHO Skipping some stuff now
GOTO End
python skipped1.py
python skipped2.py
:END
python executed2.py

我能说什么 批处理文件是很久以前的遗物,它们笨拙又难看。

您可以在此网站上阅读更多内容

编辑:对示例进行了一些修改,使其包含您显然正在寻找的元素。


31

在计算机不太快的时代,最好使用::代替REM。读取REM'ed行,然后将其忽略。::'ed一直被忽略。这可以在“过去”加速您的代码。REM之后,您需要一个空格,而::之后,您不需要。

如第一条评论中所述:您可以将信息添加到您认为需要的任何行中

SET DATETIME=%DTS:~0,8%-%DTS:~8,6% ::Makes YYYYMMDD-HHMMSS

至于零件的跳过。将REM放在每一行的前面可能会非常耗时。如前所述,使用GOTO跳过部分是跳过大型代码的简单方法。确保在希望代码继续的位置设置:LABEL。

SOME CODE

GOTO LABEL  ::REM OUT THIS LINE TO EXECUTE THE CODE BETWEEN THIS GOTO AND :LABEL

SOME CODE TO SKIP
.
LAST LINE OF CODE TO SKIP

:LABEL
CODE TO EXECUTE

1
如何在不读取的情况下忽略双冒号行?口译员在识别为双冒号行之前难道不应该先阅读该行吗?
罗伯·肯尼迪

2
@RobKennedy,当我阅读答案时,它在::之后没有读取任何内容,而REM之后的所有内容均被读取。
James Jenkins 2014年

5
如果命令解释器停止读取 @James,则它将不再执行该文件。显然,它需要继续阅读以发现注释的结尾和文件的下一行的开始。它这样做与::rem平等。
罗伯·肯尼迪

2
@RobKennedy,我还认为这暗示它仅适用于命令所在的行。
James Jenkins 2014年

7
@RobKennedy它确实读取了,但是不解析(或处理)它读取的内容,它只是跳过直到下一个\n,然后再次开始解析[需要引用]
xDaizu

25

多行注释

如果要注释掉的行数很多,那么最好进行多行注释,而不是注释掉每一行。

请参阅Rob van der Woude的有关评论块的文章

批处理语言没有注释块,尽管有一些方法可以实现效果。

GOTO EndComment1
This line is comment.
And so is this line.
And this one...
:EndComment1

您可以使用GOTOLabel和:Label进行块注释。

或者,如果注释块出现在批处理文件的末尾,则可以EXIT在代码末尾编写,然后编写任意数量的注释以供您理解。

@ECHO OFF
REM Do something
  •
  •
REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later
EXIT

Start of comment block at end of batch file
This line is comment.
And so is this line.
And this one...

这通常用于混合批处理和VBS / JS脚本中,尽管它们用于if代替goto stackoverflow.com/q/9074476/995714 ss64.com/vb/syntax-hybrid.html stackoverflow.com/a/34512715/995714
phuclv

13

使用命令将注释放在同一行: & :: comment

color C          & :: set red font color
echo IMPORTANT INFORMATION
color            & :: reset the color to default

说明:

&分隔两个命令,因此在这种情况下color C,第一个命令:: set red font color是第二个命令。


重要:

这个带有注释的语句在直觉上看起来是正确的:

goto error1         :: handling the error

但这不是对注释的有效使用。它之所以起作用,是因为goto忽略了第一个参数之后的所有参数。证明很简单,这goto也不会失败:

goto error1 handling the error

但是类似的尝试

color 17            :: grey on blue

失败执行命令由于4个参数未知的color命令:::greyonblue

它将仅作为:

color 17     &      :: grey on blue

因此,“&”号是不可避免的。


从其他答案来看,似乎不需要“&”号了吗?
RoG'7

3
@Snaptastic –在这一点上,其他答案实际上是错误的,请参阅我最近的编辑。
miroxlav '17

这似乎是正确的方法。它甚至在我的IDE中作为注释突出显示。
baburao

5

您可以使用::或注释掉某些内容REM

your commands here
:: commenttttttttttt

要么

your commands here
REM  commenttttttttttt

 

要与命令在同一行上执行此操作,必须添加“&”号:

your commands here      & ::  commenttttttttttt

要么

your commands here      & REM  commenttttttttttt

 

注意:

  • 使用:: 嵌套逻辑(IF-ELSEFOR循环等)会导致错误。在这种情况下,请REM改用。

这是基于T.Todua的答案。我觉得他们的回答很好,但是遗漏了一些重要的细节,但是他们回滚了我的编辑,因此我将自己的修订版本变成了自己的答案。
Pikamander2 '18

Pikamander2,您的修订版(也由用户指出,@Rado 当时是在答案中合并的,为此,我只希望使用另一种样式作为答案并使用其他样式。)
T.Todua

1

这是一个古老的话题,我想在这里添加我的理解,以扩展对该有趣话题的知识。

REM和::之间的主要区别是:

REM本身就是命令,而::不是。

我们可以将::视为令牌,只要CMD解析器在一行中遇到第一个非空白空间,便是::令牌,它将跳过整行并读取下一行。这就是为什么REM后面必须至少有一个空格,以便能够作为该行的注释,而::不需要在其后面有任何空格。

可以从以下FOR语法中最好地了解REM是一个命令本身

基本的FOR语法如下

FOR %v in (set) DO <Command> [command param] 

这里<Command>可以是任何有效的命令所以我们可以写出下面的有效的命令行rem是一个命令

FOR %i in (1,2,3) DO rem echo %i

但是,我们不能将以下行写::为不是命令

FOR %i in (1,2,3) DO :: echo %i

3
从技术上讲,它::是一个(无效的)标签(解释了它的行为),因此不应使用(尽管它仍然很常见)
Stephan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.