为什么这个批处理文件在“REM”行上失败?

为什么这个批处理文件在“REM”行上失败?

我指的是问题使用批处理文件将文本添加到文件名末尾(但在扩展名之前)因为我有同样的问题。使用 Windows 7 32 位企业版(我知道,我知道......)并进行所有更新,我编写了一个pdfrename.bat只有三行的小批处理文件:

  1. 一条评论,以REM和开头“隐藏”的延续符号更靠近行的右侧

  2. 建议的命令,从源中复制粘贴由@Karan 提供,注释掉REM

  3. 批处理采用的命令(加倍%):

    REM Rework 2020-12-16
    REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"
    for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"
    

从命令提示符运行命令(3.),

for %F in (*.pdf) do ren "%~F" "%~nF OdB%~xF"

工作正常。

但是从 Windows 资源管理器执行整个批处理文件pdfrename.bat失败。从命令提示符运行批处理文件pdfrename.bat会产生错误消息语法错误:

Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~na version 1%~xa"
[...]

你不需要懂德语。重点是错误信息指的是注释掉的第二行(2.)不要到第三行!

我尝试重新输入REM,在 REM 后插入制表符,REM在第一个 ( REM REM ....) 后插入第二个制表符,在第二行后插入内容相同的第三行,然后删除第二行 - 什么都没变:批处理文件在注释掉的第二行终止,并出现语法错误。一旦从批处理中删除有问题的第二行,批处理就可以正常工作。

我搜索了“REM 被忽略”,但没有找到,所以我在这里发布了这个问题。我从未听说过或经历过命令处理器至少会尝试分析注释掉的行 - 并且如果注释符号后的代码有问题,它会终止批处理脚本。

答案1

错误消息指的是注释掉的第二行

这是因为cmd处理脚本所使用的解析非常复杂。

简而言之,解析器%在几乎所有其他内容(阶段 1)之前进行处理,并引发错误,因为有些%s 需要加倍,就像%%在批处理文件中使用时一样。

因此在批处理文件中:

for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"

是有效命令并且:

REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"

是一个错误命令(应该%a%%a,等等)。

注意:

REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"

是有效命令从命令行运行时因为这样就%不需要加倍了。

REM将在解析器的第 2 阶段进行处理,但它从未到达那里,因为%第 1 阶段的处理已经产生错误并终止了解析。

有关解析器的所有详细信息,cmd请阅读解析 - Windows 命令解释器(CMD.EXE)如何解析脚本? - VoidCC

答案2

它不起作用,因为即使它被“标记”,它也会进行替换评估,并且然后显然被丢弃了。

对于“批处理”,你的第二行是不正确的,应该是

REM Rework 2020-12-16
REM for %%a in (*.txt) do ren "%%~a" "%%~na version 1%%~xa"
for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"

更正在于,批处理编程扩展中需要有 %% 而不是单个 %。

答案3

除了现有的答案外,虽然REM用于注释,但重要的是要理解它实际上是一个不执行任何操作的命令,而不是注释。这与 Unix shell 不同,在 Unix shell 中有真正的注释,并且可以在字符后添加任意文本#

不仅要评估REM命令的替代项,还要评估文件重定向。因此请注意,以下行将删除文件的内容,因为该REM命令不会产生任何输出,但空输出将重定向到文件

REM some_command > important_file

编辑

正如评论指出的那样,对于现代 Windows 版本来说,这已不再适用。根据https://stackoverflow.com/a/4095133/10765659现在有特殊处理,REM以便不执行重定向,但这种特殊处理发生得太晚而无法做出REM真正的评论,因为替代品仍在评估中。

答案4

REM 不是一个真正的注释,但在被丢弃之前会进行一些处理,这一事实指向了我所拥有的批处理文件中问题的答案,最终我将其追溯到 REM 语句。

批处理文件中的此语句仅用于提醒本节应执行的操作:

REM '/?' 标志

但相反,总是抛出错误:

此时 flag 是意外的

奇怪的是,在前面这些行根本没有产生任何错误:

REM‘-h’标志

REM‘--help’标志

因为它们有效,所以我花了一段时间才找到真正的原因。我只能逐行重建原始文件,直到出现故障,我才找到真正的罪魁祸首。

在搜索以下内容时,Google 和 Bing 都无法产生任何结果:

“此时的标志是意外的”

尽管两者都产出了大量:

“此时是出乎意料的”

也许 REM 正在抱怨它所知道的标志后面的文本。我不知道。

无论如何,当我将 REM 改为 ECHO 时,一切都按预期工作。所以我又做了一些实验:

REM 测试‘/?’标志

导致错误信息也消失。

我知道我以后必须对 REM 保持谨慎。

相关内容