asc*_*pfl 5 windows comments cmd batch-file
我试图使用该rem命令在包含多个命令的命令行中添加注释.以下是一些例子来说明我的意思:
echo Hello & rem.Comment & echo world!
(echo Hello & rem.Comment) & echo world!
Run Code Online (Sandbox Code Playgroud)
这完全正常,echo每行中的两个命令都按照我的预期执行.在.似乎修改的行为rem命令,使其不把剩余的行注释:
Run Code Online (Sandbox Code Playgroud)Hello world!
如果我放置一个SPACE(或任何其它的分隔符TAB,,,;,=)代替.,剩余线,因此,第二echo将被忽略(为一个第二实例More?出现提示,由于)是上述表示的部分和cmd期望的关闭)由于():
Run Code Online (Sandbox Code Playgroud)Hello
我发现旁边.,下列字符以及工作::,/,\,[,]和+.
还有什么工作是逃脱分隔符:^SPACE,^TAB,^,,^;和^=.
然而,有没有一种安全可靠的方法呢?
我会很高兴一个适用于命令提示符和批处理文件的解决方案.
根据这个外部参考,echo.在某些情况下,返回空行的熟悉语法失败,因此echo(建议使用,因为这是唯一可靠的方法.
但是,对于rem,(不起作用,之后的所有内容rem(都不会被识别为命令.
因为我知道的一个奇怪的bug rem在Windows XP的命令(引用这个外部链接:rem %~),我感兴趣的是适用于Windows Vista,Windows 7或更高的解决方案.
"奇怪的" REM %~"bug"不仅限于XP.它存在于使用CMD.EXE的所有Windows现代版本中.在阅读了你的问题之后,我给SS64的Simon写了一个注释,以澄清这个问题.如果存在变量var,REM也会失败rem %var:=.
因此从技术上讲,无法保证盲目使用REM的安全方法.
但是,如果你愿意接受致命%扩张的风险,大部分的上市黑客的使用是安全的,但只有当线过包括至少一个额外的命令&或&&.
REM.如果存在名为REM(没有扩展名)的文件,则在任何情况下都不能安全使用.
如果当前文件夹包含一个名为并且您使用的文件,则文件夹分隔\并/始终失败.test.batREM\..\test.bat
以类似的方式,REM:\..\test.bat总是失败.
在类似的情况下,其他每一个黑客都可以单独失败.例如,REM^[tab]\..\test.bat单独运行失败,但如果与另一个命令连接则有效.这是形势的唯一类型,我发现在那里+,[,],或^[tab]可能会失败.
还有一些其他案例可能会失败.
在集合C的任何字符(^[space],^,,^;,^=如果文件名是有效的)可能无法独立remC.bat存在.例如,以下单独失败:
rem^ Fails if "rem .bat" exists
Run Code Online (Sandbox Code Playgroud)
然而,当与另一个命令连接时,它们都是安全的:
echo OK&rem^ This is safe
rem^ This is safe &echo OK
Run Code Online (Sandbox Code Playgroud)
临时更新
以上一些是错误的.调查正在http://www.dostips.com/forum/viewtopic.php?f=3&t=6895&p=44813#p44813进行.
我相信以下是最简单的形式,保证在所有情况下都有效(忽略无效的%扩展)
REM: At least one space (or other token delimiter) must be after :
REM\ At least one space (or other token delimiter) must be after \
REM/ At least one space (or other token delimiter) must be after /
REM^[tab] At lease one space (or other token delimiter) must be after [tab]
Run Code Online (Sandbox Code Playgroud)
但是,在尘埃落定之前,我不会纠正早先的信息
结束临时更新
我最喜欢使用内联注释的方法是使用不可能的变量.只有动态伪变量可以包含=在名称中,并且变量名称不能包含两个=.所以我喜欢用%= Remark goes here =%.这种形式的美妙之处在于它几乎可以在任何地方使用而不受惩罚,只要评论不包含%或:.它甚至可以在带括号的代码块中安全使用.
for %%F in (*) do (
%= Comment within code block =%
%= 2nd comment within code block =%
FINDSTR /B %=Must match beginning of line=% "string" %= Search string =% "%%F" %= File to search =%
)
Run Code Online (Sandbox Code Playgroud)