我应该在批处理文件中使用哪种评论风格?
我一直在写一些批处理文件,然后我遇到了这个用户指南,这个指南非常有用。 它向我展示的一件事是,不仅可以用REM
对线条进行评论,还可以对::
进行评论。 它说:
批处理代码中的注释可以通过使用双冒号来完成,这比使用REM命令更好,因为标签是在重定向符号之前处理的。 ::<remark>
不会导致问题,但rem <remark>
会产生错误。
那么,为什么我会使用REM
命令做大多数指南和例子? 是否::
适用于所有版本的Windows?
tl; dr: REM
是在批处理文件中嵌入批注的记录和支持的方式。
::
实质上是一个永远不会被跳到的空白标签,而REM
是一个没有任何作用的实际命令。 在任何情况下(至少在Windows 7上)重定向操作符的存在都会导致问题。
但是,在某些情况下, ::
被称为在块中行为不当,被解析为不是标签,而是某种驱动器盘符。 我对某个地方有点模糊不清,但仅此一点就足以让我完全使用REM
。 它是在批处理文件中嵌入批注的记录和支持的方式,而::
仅仅是特定实现的工件。
编辑
这是一个例子,其中::
在FOR
循环中产生问题。
这个例子在你桌面上的一个名为test.bat
的文件中不起作用:
@echo off
for /F "delims=" %%A in ('type C:Users%username%Desktoptest.bat') do (
::echo hello>C:Users%username%Desktoptext.txt
)
pause
虽然这个例子可以正确地评论:
@echo off
for /F "delims=" %%A in ('type C:Users%username%Desktoptest.bat') do (
REM echo hello>C:Users%username%Desktoptext.txt
)
pause
尝试将输出重定向到文件时,问题似乎是。 我最好的猜测是它将::
解释为一个名为:echo
的转义标签。
REM的评论
如果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
但为了避免REM
, REM.bat
或REM;.bat
等现有文件出现问题,只能使用修改后的变体。
REM^;<space>Comment
对于角色;
也是允许的一种;,:/=
REM比Win ::
慢6倍左右(在Win7SP1上用100000条注释行测试)。
对于正常使用情况来说,这并不重要(每条注释行58μs与360μs)
评论::
A ::
总是执行行结束符。
:: This is also a comment^
echo This line is also a comment
标签和注释标签::
在括号块中有一个特殊的逻辑。
它们总是跨越两行SO:goto command not working。
所以他们不推荐用于括号,因为它们通常是语法错误的原因。
ECHO ON
在REM
线上显示,但不是一行评论::
两者都不能真正注释掉其余部分,所以简单的%~
会导致语法错误。
REM This comment will result in an error %~ ...
但是,即使在特殊字符阶段完成之前,REM也能够在早期阶段停止批解析器。
@echo ON
REM This caret ^ is visible
您可以使用&REM或&::在命令行末尾添加注释。 这种方法是有效的,因为'&'在同一行上引入了一个新的命令。
带百分号的评论%= comment =%
存在具有百分号的评论风格。
事实上,这些都是可变的,但它们已经扩大到没有。
但优点是它们可以放在同一条线上,即使没有&
。
等号确保这样一个变量不能存在。
echo Mytest
set "var=3" %= This is a comment in the same line=%
批处理宏建议使用百分比样式,因为它不会更改运行时行为,因为在定义宏时将删除注释。
set $test=(%n%
%=Start of code=% ^
echo myMacro%n%
)
当我意识到我可以使用label ::
来发表评论和评论代码REM
,对我来说显得很丑陋。 正如前面提到的,当使用inside ()
被阻塞的代码时,双冒号会导致问题,但是我发现了在标签::
和:
space之间交替的解决方法
:: 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
.
.
.
使用什么都记法你想*
的, @
的等。