windows - 如何在不忽略相邻命令的情况下在命令行中可靠地使用 `rem`?

标签 windows batch-file cmd comments

我正在尝试使用 rem 命令在包含多个命令的命令行中添加注释。下面是一些例子来说明我的意思:

echo Hello & rem.Comment & echo world!

(echo Hello & rem.Comment) & echo world!

这工作得很好,每行中的两个 echo 命令都按我预期的那样执行。 . 似乎修改了 rem 命令的行为,因此它不会将剩余的行视为注释:

Hello 
world!

如果我放置一个 SPACE(或任何其他分隔符 TAB =) 而不是 .,剩余的行和第二个 echo 将被忽略(对于第二个示例,More? 出现提示,因为 ) 是备注的一部分,cmd 期望结束 ) 因为 ( ):

Hello 

我发现除了 . 之外,以下字符也可以使用::/\[]+
其他有效的是转义分隔符:^SPACE^TAB^、 , ^;^=

不过,是否有安全可靠的方法来做到这一点?

如果有一个同时适用于命令提示符和批处理文件的解决方案,我将非常高兴。


根据 this external reference ,用于返回空行的熟悉语法 echo. 在某些情况下会失败,因此建议使用 echo(,因为这是唯一可靠的方法。

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


因为我知道 Windows XP 中的 rem 命令有一个奇怪的错误(引用 this external link : rem %~),所以我对适用于 Windows Vista、Windows 7 或更高版本的解决方案。

最佳答案

“奇怪的”REM %~“bug”并不局限于 XP。它存在于所有使用 CMD.EXE 的现代 Windows 版本中。看完你的问题后,我wrote Simon of SS64 a note澄清问题。如果变量 var 存在,并且您有 rem %var:=,REM 也会失败。

所以从技术上讲,盲目使用 REM 并不能保证安全。

但是,如果您愿意接受致命的 % 扩展风险,那么您列出的大多数黑客都可以安全使用,但只有该行包含至少一个通过 & 的附加命令&&

REM. 如果存在名为 REM(无扩展名)的文件,则在任何情况下都无法安全使用。

如果当前文件夹包含名为 test.bat 的文件并且您使用 REM,则文件夹分隔符 \/ 总是失败\..\test.bat.

以类似的方式,REM:\..\test.bat 总是失败。

在类似的情况下,其他每一个 hacks 都可能单独失败。例如,REM^[tab]\..\test.bat 单独运行失败,但与另一个命令连接时可以运行。这是我发现的唯一一种情况,其中 +[]^[tab] 可能会失败。

还有一些其他黑客可能会失败的其他情况。

集合C中的任意字符(^[space], ^,, ^;, ^=) 如果 remC.bat 存在,则在文件名中有效的文件名可能会失败。例如,以下独立失败:

rem^  Fails if "rem .bat" exists

然而,当与另一个命令连接时,它们都是安全的:

echo OK&rem^  This is safe
rem^  This is safe &echo OK

临时更新

以上有些地方是错误的。调查正在进行中 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]

但在尘埃落定之前我不会更正之前的信息

结束临时更新



我最喜欢使用内联注释的方式是使用不可能的变量。只有动态伪变量可以在名称中包含 =,并且任何变量名称都不能包含两个 =。所以我喜欢用%= 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 =%
)

关于windows - 如何在不忽略相邻命令的情况下在命令行中可靠地使用 `rem`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780433/

相关文章:

batch-file - Windows批处理方式用单个文件替换子目录中的所有文件(复制,重命名所有文件)

与 TeamViewer 相同的 Windows 安装程序

c++ - 无需太多更改即可将 MFC 应用程序设置为最大分辨率

git - 在 git shell 中运行批处理文件

windows - 如何通过cmd调用删除文件夹中的所有文件和文件夹

windows - 使用 forfiles 和 7zip 的文件名中的空格

cmd - Gradle 不会在命令提示符中构建 gradle -v

c# - 有关通过 Windows Installer 安装应用程序的问题

c++ - 在 Windows C++ 程序中绘制骰子?

batch-file - 在 z/OS 上运行部署在 Liberty 配置文件中的 Java 批处理