Batch file 为什么批处理解释注释?
我有一个简单的批测试文件test.bat,其中包含以下行: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
@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