Batch file 为什么批处理解释注释?

Batch file 为什么批处理解释注释?,batch-file,Batch File,我有一个简单的批测试文件test.bat,其中包含以下行: @echo off REM IF "%~version_info" == "" echo No version information found echo test 当我运行它时,我希望得到的是测试,而不是: The following usage of the path operator in batch-parameter substitution is invalid: %~version_info" == "" echo N

我有一个简单的批测试文件test.bat,其中包含以下行:

@echo off
REM IF "%~version_info" == "" echo No version information found
echo test
当我运行它时,我希望得到的是测试,而不是:

The following usage of the path operator in batch-parameter
substitution is invalid: %~version_info" == "" echo No version information found


For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
为什么batch试图解释该评论?或者这里发生了什么?如果我去掉注释,脚本将按预期打印测试

也没有提到这方面的任何内容。

它并没有忽略它

在批处理文件中,您需要添加
%%
,而不是
%%
,因此它只是警告您替换无效。cmdline仍会读取注释行,如果您的命令有效,但方法不正确,则会发出警告

这样做,您将不会得到警告:

@echo off
REM IF "%%~version_info" == "" echo No version information found
echo test

如果不想修改已注释的代码,可以使用:

REM %= IF "%~version_info" == "" echo No version information found
虽然这有点难看,但它将避免解释
%~

您可以在中找到有关批量评论的更多信息


至于为什么会出现这种情况,整个批处理过程听起来有点混乱。

我认为这是解析序列的结果。在本例中,这是一个问题,但假设您编写代码(如我所做的):

首先,我们替换
%vars%
中的值,然后解释该行,使用第一个标记作为要执行的命令。上述构造允许更改命令


所以有一种方法可以解决疯狂…

原因是批处理脚本的顺序

首先发生的是(poor1)
%
-符号处理,即普通变量(
%VAR%
)和命令行参数(
%1
%2
)扩展。命令,甚至是rem,都会在以后的解析阶段被识别

字符串
%~
是无效的参数引用,因为既没有有效的修饰符,也没有此类修饰符的组合(
f
d
p
n
x
s
a
t
z
路径:
)或后面的数字

请参阅此线程:



1。。。在我看来,
%
扩展是错误的,因为
%~
%VAR:=
%VAR:*=
,如果定义了变量
VAR
,则会导致错误,变量扩展如
%VAR:[*]搜索=[replace]
%VAR:~[position][,[length]]%如果未定义
VAR
,则会中止
VAR:~%STR%
STR
设置为
text
时会扩展为
~text

为什么批解释注释

它不解释注释,但它必须解析行,这就是问题所在

首先,解析器读取一行

然后展开所有百分比表达式,然后查看行中的第一个标记。
如果第一个标记是
REM
,那么剩余的内容将不再被解释(重定向、延迟扩展、管道、符号等都将被忽略)


问题是,解析器首先扩展所有百分比表达式,当出现类似
%~
的表达式时,解析器会抛出一条错误消息。

这听起来太疯狂了,我不得不检查:有我的投票!我发现了一个关于这一点的注释:
两个[::和REM]都不能真正注释掉这行的其余部分,因此简单的注释将导致语法错误阅读此问答,我知道它在做什么,以及如何修复它。我的问题是为什么?这看起来很疯狂,你为什么要解析注释呢?注释应该是注释,而不是真正的代码行,被注释掉了。它实际上是一个
rem
ark。如果您有一个有效的命令,它仍在被读取,但是看到您的语句中有一个错误,您将被告知。否。与作为命令的
rem
无关。如果您更改为breaked label
,它将执行与我所看到的完全相同的操作,因此它可以用作一种记录器。你可能还记得你在哪里看到的,或者从哪里得到的吗?我很好奇这种做法有多古老,从何而来。我不知道它的历史,但我已经使用这种方法多年了。
set "debug=rem"
%debug% echo some debug data