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

How to “comment-out” (add comment) in a batch/cmd?

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

  • 我想让用户评论他们不想运行的1-2个python脚本,而不是将它们从批处理文件中删除(这样下一个用户就知道这些脚本作为选项存在!)

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

  • 是否有更合适的语法来添加注释?


    ::REM

    1
    2
    ::   commenttttttttttt
    REM  commenttttttttttt

    但是(如人们所说):

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


    REM命令确实是为了征求意见。它不会在运行脚本之后固有地更新任何人。但是,一些脚本作者可能会用这种方式来代替ECHO,因为默认情况下,批处理解释器会在处理每个命令之前打印出它。由于REM命令不起作用,因此打印它们时不产生副作用是安全的。要避免打印命令,请在命令前面加上@前缀,或者在整个程序中应用该设置,请运行@echo off。(这是避免打印更多命令的echo off@是避免在回声设置生效之前打印该命令。)

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

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


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

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

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

    编辑:稍微修改示例,使其包含您显然要查找的元素。


    在计算机速度不太快的时候,最好使用::而不是REM。读取删除的行,然后忽略。::'ed行一直被忽略。这可以在"旧时代"中加速您的代码。在REM之后,你需要一个空间,在::之后,你不需要。

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

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

    至于零件的跳过。把REM放在每一行前面是相当耗时的。如前所述,使用goto跳过部分是跳过大块代码的简单方法。请确保在希望代码继续的位置设置:标签。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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
    3
    4
    5
    GOTO EndComment1
    This line is comment.
    And so is this line.
    And this one...
    :EndComment1

    您可以使用GOTO标签和:标签进行块注释。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @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...

    评论来源


    使用命令在同一行添加注释:使用& :: comment

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

    说明:

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

    重要:

    此带有注释的语句看起来直观正确:

    1
    goto error1         :: handling the error

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

    1
    goto error1 handling the error

    但同样的尝试

    1
    color 17            :: grey on blue

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

    它只能在以下情况下工作:

    1
    color 17     &      :: grey on blue

    因此,符号是不可避免的。


    你可以用::REM来评论:

    1
    2
    your commands here
    :: commenttttttttttt

    1
    2
    your commands here
    REM  commenttttttttttt

    nbsp;

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

    1
    your commands here      & ::  commenttttttttttt

    1
    your commands here      & REM  commenttttttttttt

    nbsp;

    注:

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


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

    REM和::的主要区别在于:

    REM本身是一个命令,而::不是。

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

    REM本身就是一个命令,从下面的语法中可以很好地理解它。

    基本语法如下

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

    这里,可以是任何有效的命令因此我们可以编写以下有效的命令行,因为rem是一个命令

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

    但是,由于::不是命令,因此我们不能编写以下行

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