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

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

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

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

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

答案

使用::REM

::   commenttttttttttt
REM  commenttttttttttt

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

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

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

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

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

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

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

在计算机不太快的时代,最好使用:: 代替 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

多行注释

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

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

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

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

您可以使用GOTO Label 和: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...

使用命令将注释放在同一行:use & :: 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

由于color命令未知的 4 个参数,无法执行该命令::greyonblue

它将仅作为:

color 17     &      :: grey on blue

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

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

your commands here
:: commenttttttttttt

要么

your commands here
REM  commenttttttttttt

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

your commands here      & ::  commenttttttttttt

要么

your commands here      & REM  commenttttttttttt

注意:

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

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

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