我应该在批处理文件中使用哪种注释风格?(Which comment style should I u

2019-06-18 03:49发布

我一直在写一些批处理文件,我碰到了本用户指南 ,这已经相当丰富。 一两件事给我的是,行可以注释不仅仅是REM ,而且还与:: 。 它说:

在批次代码注释可以通过使用双冒号制成,这比使用REM命令,因为标签被重定向符号之前处理更好。 ::<remark>不会引起问题,但rem <remark>产生错误。

那么,为什么做大部分导游和例子我看到使用REM命令? 请问::在所有版本的Windows工作?

Answer 1:

TL;博士: REM是嵌入在批处理文件注释的文档和支持的方式。


::本质上是一个空白标签永远不能跳楼,而REM是一个实际的命令,只是什么都不做。 在两种情况下(至少在Windows 7)不重定向操作符的存在引起的问题。

但是, ::是已知的,在某些情况下块胡作非为,被解析不作为标签,但由于某种驱动器号。 我在这里完全是一个有点模糊,但单独就足以让我用REM独占。 这是嵌入在批处理文件注释,而文档和支持方式::仅仅是特定实现的神器。


这里是一个例子::在一个产生一个问题FOR循环。

这个例子将不会在一个名为工作test.bat桌面上:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

虽然这个例子将作为正确评论:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

这个问题似乎试图输出重定向到一个文件时要。 我最好的猜测是,它是解释::作为称为逃脱标签:echo



Answer 2:

与REM评论

一个REM可以此话的完整产品线,还行端多行插入符号,如果不是第一个记号结束。

REM This is a comment, the caret is ignored^
echo This line is printed

REM This_is_a_comment_the_caret_appends_the_next_line^
echo This line is part of the remark

REM其次是一些字符.:\/=的工作方式有些不同,它并没有发表评论的符号,所以你可以用它为行内注释。

echo First & REM. This is a comment & echo second

但要避免像现有文件的问题REMREM.batREM;.bat只有经修饰的变应使用。

REM^;<space>Comment

而对于字符; 也是允许的一个;,:\/=

REM是较慢的6倍 :: (上Win7SP1测试100000注释行)。
对于正常使用这并不重要(58μs对每个注释行360μs)

注释以::

::总是执行线路末端插入符号。

:: This is also a comment^
echo This line is also a comment

标签也评语标签 ::有括号块一个特殊的逻辑。
他们总是跨越两行SO:跳转指令不工作 。
因此,他们建议不要括号块,因为他们往往是语法错误的原因。

随着ECHO ON一个REM线所示,但不是符合评论::

双方不能真正注释掉行的其余部分,所以简单%~会导致语法错误。

REM This comment will result in an error %~ ...

但REM能够在早期阶段停止批处理解析器,特殊字符阶段完成之前就。

@echo ON
REM This caret ^ is visible

你可以用与REM或::添加注释,以命令行的末尾。 这种方法有效,因为“&”介绍在同一行的新命令。

用百分号(%)=评论=%点评

存在一个百分号评论风格。

在现实中,这些变数,但他们扩展到什么。
但好处是,可以将它们放置在同一行,即使不&
等号保证,这样的变量不能存在。

echo Mytest
set "var=3"     %= This is a comment in the same line=%

百分比风格适合批量宏,因为它不会改变运行时的行为,如宏定义时的评论将被删除。

set $test=(%\n%
%=Start of code=% ^
echo myMacro%\n%
)


Answer 3:

另一种方法是表达作为一个变量扩展总是扩展到什么评论。

变量名不能包含= ,除了像无证动态变量
%=ExitCode%%=C:% 没有变量名都不能包含= 1号位后。 所以我有时会使用以下方法来包括括号中的块中的注释:

::This comment hack is not always safe within parentheses.
(
  %= This comment hack is always safe, even within parentheses =%
)

这也是纳入行注释的好方法

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

领先=是没有必要的,但我想如果对称性。

有两个限制:

1)注释不能包含%

2)注释不能包含:



Answer 4:

之后,我意识到,我可以使用标签::提出意见和注释掉的代码REM只是看着丑陋给我。 由于内使用时已经提到双冒号可能会导致问题()受阻代码,但我已经通过标签之间交替发现了一个变通::: 空间

:: This, of course, does
:: not cause errors.

(
  :: But
   : neither
  :: does
   : this.
)

这不是丑像REM ,实际上增加了一个小的风格你的代码。

所以代码块之外我用::和里面他们我之间交替:::

顺便说一句,对于大帅哥的意见,像在批处理文件的标题,你可以通过简单地避免特殊的命令和人物完全goto荷兰国际集团在您的意见。 这使你可以用任何方法,你想标记的风格,尽管事实上,如果CMD曾经真实目的是试图处理这些线它会抛出一个嘘声像。

@echo off
goto :TopOfCode

=======================================================================
COOLCODE.BAT

Useage:
  COOLCODE [/?] | [ [/a][/c:[##][a][b][c]] INPUTFILE OUTPUTFILE ]

Switches:
       /?    - This menu
       /a    - Some option
       /c:## - Where ## is which line number to begin the processing at.
         :a  - Some optional method of processing
         :b  - A third option for processing
         :c  - A forth option
  INPUTFILE  - The file to process.
  OUTPUTFILE - Store results here.

 Notes:
   Bla bla bla.

:TopOfCode
CODE
.
.
.

使用什么都记法你想*的, @的等。



Answer 5:

这个答案尝试此页面上的许多伟大的答案务实总结

杰布最伟大的回答特别值得一提,因为它真的去深入,涵盖了许多边缘情况。
值得注意的是,他指出, 一个misconstructed变量/参数参考如%~可以打破任何以下解决方案-包括REM线


全行注释-唯一的直接支持方式:

  • REM (或情况变体)是唯一官方评论结构 ,并且是最安全选择 -看乔伊的有用的答案 。

  • ::是(广泛使用的) 破解 ,其具有优点和缺点

    • 优点

      • 视觉显着性 ,可能的话,方便输入。
      • 速度 ,尽管这可能会很少事情-看杰布最伟大的答案和罗布·范德Woude的优秀博客文章 。
    • 缺点

      • 里面(...)块, ::可以打破的命令 ,并为安全使用规则严格,不容易记住 -见下文。

如果想使用:: ,您有以下选择:

  • 或者 :为了安全起见,破例内(...)块和使用REM那里,或者不要放置评论(...)完全。
  • :记忆安全使用的痛苦限制性规则::(...)总结在下面的代码片段:
@echo off

for %%i in ("dummy loop") do (

  :: This works: ONE comment line only, followed by a DIFFERENT, NONBLANK line.
  date /t

  REM If you followed a :: line directly with another one, the *2nd* one
  REM would generate a spurious "The system cannot find the drive specified."
  REM error message and potentially execute commands inside the comment.
  REM In the following - commented-out - example, file "out.txt" would be
  REM created (as an empty file), and the ECHO command would execute.
  REM   :: 1st line
  REM   :: 2nd line > out.txt & echo HERE

  REM NOTE: If :: were used in the 2 cases explained below, the FOR statement
  REM would *break altogether*, reporting:
  REM  1st case: "The syntax of the command is incorrect."
  REM  2nd case: ") was unexpected at this time."

  REM Because the next line is *blank*, :: would NOT work here.

  REM Because this is the *last line* in the block, :: would NOT work here.
)

其他注释风格仿真-内联和多行:

请注意, 没有这些样式是直接由批处理语言的支持 ,但也可以效仿


内嵌评论

*使用以下的代码片段ver作为一个独立的在对于任意的命令,以便有利于实验。
*为了使SET命令其内部注释正常工作,双引号中name=value部分; 例如, SET "foo=bar" [1]

在这方面,我们可以区分两种亚型:

  • EOL注释 ([给-the-]结束的行),其可以被放置在命令之后,并且总是延伸到行的结尾(再次,礼貌杰布的回答 ):

    • ver & REM <comment>利用这样的事实即优点REM是一个有效的命令和&可以使用现有的后放置一个附加的命令。
    • ver & :: <comment>工作过,但实在只能用于境外(...) ,因为它的安全使用,甚至有比使用更为有限::独立。
  • 帧内行注释 ,其被放置多个命令之间的线上或理想地甚至的给定指令的。
    帧内行注释是最灵活的(单线)形式,并且可以通过定义也可以用作EOL注释。

    • ver & REM^. ^<comment^> & ver ver & REM^. ^<comment^> & ver允许插入 (同样,礼貌的命令之间的评论 杰布的答案 ),但要注意如何<>需要的是^转义,因为下面的字符。 不能原样使用: < > | (而非转义&&&||开始下一命令)。

    • %= <comment> =%如在详细dbenham的伟大答案 ,是最灵活形式 ,因为它可以被放置在命令 (的参数中)。
      这需要在确保表达式总是扩展为空字符串的方式利用可变扩展语法- 只要注释文本既不包含%也不:
      REM%= <comment> =%工作良好的外部和内部(...)块,但它更视觉上不同的; 唯一的下侧是,它是很难打字,更容易得到错误的语法,而不是广为人知,它可以阻碍了使用该技术的源代码的理解。


多行(全行数据块)的评论

  • 詹姆斯·K公司的回答显示了如何使用goto的语句和标签来界定任意长度和内容(这在他的情况下,他用来存储使用信息)的多行注释。

  • ZEE的回答显示了如何使用“空标签”来创建一个多行注释,但必须小心终止所有内线与^

  • 罗布的van der Woude的博客文章提到了另一种有些模糊的选项,让你结束一个文件的注释行的任意数目 :一个开口(不仅造成自带之后被忽略 ,只要它不包含一切 (非- ^转义) ) ,即,只要该块未关闭


[1]使用SET "foo=bar"定义变量-即,将周围的名称双引号和=组合的值-在命令必要如SET "foo=bar" & REM Set foo to bar. ,以确保接下来的预期变量值(到下一个命令,在这种情况下,单个空间)不会意外地成为它的一部分。
(顺便说一句: SET foo="bar"不仅无法回避的问题,它将使值的双引号部分 )。
请注意,这个问题是固有的SET ,甚至适用于下列值意外尾随空白, 因此建议始终使用SET "foo=bar"的办法。



Answer 6:

此页面告诉使用“::”将刚才的事情在某些约束下更快进行选择时要考虑



Answer 7:

好问题。我一直在寻找这个功能,长期过...

经过多次试验和技巧,它似乎更好的解决方案是比较明显的一个...

- >最好的方法我发现做到这一点,防止解析器完整性失败,被重用REM:

echo this will show until the next REM &REM this will not show

你也可以用多用“空标签”招......(不要忘了^在连续性行的结尾)

::(^
this is a multiline^
comment... inside a null label!^
dont forget the ^caret at the end-of-line^
to assure continuity of text^ 
)


Answer 8:

詹姆斯·K,对不起,我错在我说的相当一部分。 我做的测试是以下几点:

@ECHO OFF
(
  :: But
   : neither
  :: does
   : this
  :: also.
)

这符合你的描述交替,但失败了“),在这个时候意外的。” 错误信息。

我做了一些测试更远今天发现,交替不是关键,但它出现的关键是具有偶数行的,没有开始与双冒号(行中的任意两行::)而不是双冒号结束。 考虑以下:

@ECHO OFF
(
   : But
   : neither
   : does
   : this
   : cause
   : problems.
)

这个作品!

但也考虑这个问题:

@ECHO OFF
(
   : Test1
   : Test2
   : Test3
   : Test4
   : Test5
   ECHO.
)

具有偶数的意见的规则似乎并不在一个命令结束时应用。

不幸的是这仅仅是疯狂的,以至于我不知道我要使用它。

说真的,最好的解决办法,那我能想到的最安全的,如果是像记事本++程序会读REM为双冒号,然后在文件保存会写双冒号后面的REM语句。 但我不知道这样的程序,我不知道这是否无论任何插件记事本++的。



Answer 9:

关于该主题的非常详细的分析讨论可在此页

它具有例如代码和不同方案的优点/缺点。



文章来源: Which comment style should I use in batch files?