我一直在写一些批处理文件,我碰到了本用户指南 ,这已经相当丰富。 一两件事给我的是,行可以注释不仅仅是REM
,而且还与::
。 它说:
在批次代码注释可以通过使用双冒号制成,这比使用REM命令,因为标签被重定向符号之前处理更好。
::<remark>
不会引起问题,但rem <remark>
产生错误。
那么,为什么做大部分导游和例子我看到使用REM
命令? 请问::
在所有版本的Windows工作?
我一直在写一些批处理文件,我碰到了本用户指南 ,这已经相当丰富。 一两件事给我的是,行可以注释不仅仅是REM
,而且还与::
。 它说:
在批次代码注释可以通过使用双冒号制成,这比使用REM命令,因为标签被重定向符号之前处理更好。
::<remark>
不会引起问题,但rem <remark>
产生错误。
那么,为什么做大部分导游和例子我看到使用REM
命令? 请问::
在所有版本的Windows工作?
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
。
一个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是较慢的约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%
)
另一种方法是表达作为一个变量扩展总是扩展到什么评论。
变量名不能包含=
,除了像无证动态变量
%=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)注释不能包含:
之后,我意识到,我可以使用标签::
提出意见和注释掉的代码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
.
.
.
使用什么都记法你想*
的, @
的等。
这个答案尝试此页面上的许多伟大的答案务实的总结 :
杰布最伟大的回答特别值得一提,因为它真的去深入,涵盖了许多边缘情况。
值得注意的是,他指出, 一个misconstructed变量/参数参考如%~
可以打破任何以下解决方案-包括REM
线 。
REM
(或情况变体)是唯一的官方评论结构 ,并且是最安全的选择 -看乔伊的有用的答案 。
::
是(广泛使用的) 破解 ,其具有优点和缺点 :
优点 :
缺点 :
(...)
块, ::
可以打破的命令 ,并为安全使用规则严格,不容易记住 -见下文。 如果你想使用::
,您有以下选择:
(...)
块和使用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"
的办法。
此页面告诉使用“::”将刚才的事情在某些约束下更快进行选择时要考虑
好问题。我一直在寻找这个功能,长期过...
经过多次试验和技巧,它似乎更好的解决方案是比较明显的一个...
- >最好的方法我发现做到这一点,防止解析器完整性失败,被重用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^
)
詹姆斯·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语句。 但我不知道这样的程序,我不知道这是否无论任何插件记事本++的。
关于该主题的非常详细的分析讨论可在此页
它具有例如代码和不同方案的优点/缺点。