繁体   English   中英

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

[英]How to “comment-out” (add comment) in a batch/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 设置生效之前打印命令。)

所以,在你的批处理文件中,你可以使用这个:

@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 行一直被忽略。 这可以在“过去”加速您的代码。 更进一步,在 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...

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

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

@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

只要确保你从不使用右括号。

归因:Leo Guttirez Ramirez 在https://www.robvanderwoude.com/comments.php

这是一个古老的话题,我想在这里补充一下我的理解,以扩展对这个有趣话题的了解。

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

您可以使用::rem进行注释。

评论时,使用::因为它快 3 倍。 此处显示一个示例

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

注释一行

对于注释行使用REM 或 ::虽然::可能会在括号内失败

在以!<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
------------------

内嵌注释

不存在的变量的扩展被替换为空,并且当使用=设置变量时,您可以将其用于内联注释

@echo off

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

多行注释

对于多行注释,可以使用GOTO (用于外括号)和带有条件执行的REM (用于内括号)。 更多细节在这里

@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
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM