如何在命令行中可靠地使用`rem`而不忽略相邻的命令?

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命令,使其不把剩余的行注释:

Hello 
world!
Run Code Online (Sandbox Code Playgroud)

如果我放置一个SPACE(或任何其它的分隔符TAB,,,;,=)代替.,剩余线,因此,第二echo将被忽略(为一个第二实例More?出现提示,由于)是上述表示的部分和cmd期望的关闭)由于():

Hello 
Run Code Online (Sandbox Code Playgroud)

我发现旁边.,下列字符以及工作::,/,\,[,]+.
还有什么工作是逃脱分隔符:^SPACE,^TAB,^,,^;^=.

然而,有没有一种安全可靠的方法呢?

我会很高兴一个适用于命令提示符和批处理文件的解决方案.


根据这个外部参考,echo.在某些情况下,返回空行的熟悉语法失败,因此echo(建议使用,因为这是唯一可靠的方法.

但是,对于rem,(不起作用,之后的所有内容rem(都不会被识别为命令.


因为我知道的一个奇怪的bug rem在Windows XP的命令(引用这个外部链接:rem %~),我感兴趣的是适用于Windows Vista,Windows 7或更高的解决方案.

dbe*_*ham 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)