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

时间:2012-06-29 21:40:59

标签: batch-file cmd comments commenting comment-conventions

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

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

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

  3. 是否有更适当添加评论的语法?

11 个答案:

答案 0 :(得分:824)

使用::REM

::   commenttttttttttt
REM  commenttttttttttt

但是(正如人们所说):

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

答案 1 :(得分:756)

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

答案 2 :(得分:42)

不,普通的旧批处理文件使用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

我能说什么?批处理文件是很久以来的遗留物,它们很笨拙和丑陋。

您可以阅读更多on this website

编辑:稍微修改了一下示例,让它包含您正在寻找的元素。

答案 3 :(得分:28)

在计算机不是很快的时候,最好使用::而不是REM。 读取REM行,然后进行刻录。 ::'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

答案 4 :(得分:22)

多行评论

如果您想要注释掉大量的行,那么如果您可以创建多行注释而不是注释掉每一行,那将会更好。

批处理语言没有注释块,但有办法完成效果。

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

您可以使用GOTO标签和:标签进行广告评论。

或者,如果评论块出现在批处理文件的末尾,您可以在代码末尾写下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...

Comments Source

答案 5 :(得分:12)

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

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

<强>解释

& separates two commands,所以在这种情况下color C是第一个命令,:: set red font color是第二个命令。

重要:

此评论的陈述看起来直观正确:

goto error1         :: handling the error

不是评论的有效用途。它的工作原理只是因为goto忽略了第一个之后的所有参数。证明很简单,goto也不会失败:

goto error1 handling the error

但类似的尝试

color 17            :: grey on blue
由于color命令未知的4个参数,

执行命令失败:::greyonblue

它只能起作用:

color 17     &      :: grey on blue

所以&符号是不可避免的。

答案 6 :(得分:3)

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

your commands here
:: commenttttttttttt

your commands here
REM  commenttttttttttt

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

your commands here      & ::  commenttttttttttt

your commands here      & REM  commenttttttttttt

注意:

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

答案 7 :(得分:2)

您可以使用以下语法在批处理文件的末尾添加注释:

@echo off
:: Start of code
...
:: End of code

(I am a comment
So I am!
This can be only at the end of batch files

只需确保您不要使用右括号即可。

出处:https://www.robvanderwoude.com/comments.php上的Leo Guttirez Ramirez

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

您可以使用::rem进行评论。

评论时,请使用::,因为它快了3倍。显示了一个示例recreated

仅当注释在if中时,才使用rem,因为冒号是标签,冒号可能会出错。

答案 10 :(得分:0)

注释一行

对于评论行,请使用REM or ::,尽管::可能fail inside brackets

在以!<delimiter>开头的延迟扩展行内将被忽略,因此可以将其用作注释:

@echo off

setlocal enableDelayedExpansion

echo delayed expansion activated
!;delayed expansion commented line
echo end of the demonstration

在行尾注释

对于行尾的注释,您可以再次将rem::&结合使用:

echo --- &:: comment (should not be the last line in the script)
echo --- &rem comment

在文件末尾注释

由于注意将在exit命令之后进行解析,因此您可以使用它在文件末尾添加注释:

@echo off

echo commands

exit /b 

-------------------
commnts at the end 
of the file
------------------

内嵌评论

不存在任何替换变量的扩展,并且用=设置变量相当困难,您可以use this for inline comments

@echo off

echo long command %= this is a comment =% with an inline comment

多行注释

对于多行注释,可以使用GOTO(对于外部括号)和REM,并带有条件执行(对于内部括号)。 More details here

@echo off

echo starting script

goto :end_comments
 comented line 
 one more commented line
:end_comments

echo continue with the script

(
    echo demonstration off
    rem/||(
      lines with
      comments
    )
    echo multiline comment inside
    echo brackets
)

使用宏美化相同的技术

@echo off

::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"

::testing
echo not commented 1

%[:%
  multi 
  line
  comment outside of brackets
%:]%

echo not commented 2

%[:%
  second multi 
  line
  comment outside of brackets
%:]%

::GOTO macro cannot be used inside for
for %%a in (first second) do (
    echo first not commented line of the %%a execution
    %[%
        multi line
        comment
    %]%
    echo second not commented line of the %%a execution
)