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

gkl*_*kln 36 windows batch comments command-line batch-file

我指的是使用批处理文件将文本添加到文件名末尾(但在扩展名之前)的问题,因为我遇到了同样的问题。使用带有所有更新的 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"
    
    Run Code Online (Sandbox Code Playgroud)

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

for %F in (*.pdf) do ren "%~F" "%~nF OdB%~xF"
Run Code Online (Sandbox Code Playgroud)

工作正常。

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

Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~na version 1%~xa"
[...]
Run Code Online (Sandbox Code Playgroud)

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

我尝试重新输入REM,在 REM 之后插入一个制表符,REM在第一个 ( REM REM ....)之后插入第二个,在第二个之后插入第三行,内容相同,然后删除第二行 - 没有任何变化:批处理文件终止于注释掉第二行有语法错误。一旦从批次中消除了有罪的第二行,批次就可以正常工作。

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

Dav*_*ill 50

error-msg 是指注释掉的第二行

这是由于用于cmd处理脚本的非常复杂的解析。

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

所以在批处理文件中:

for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"
Run Code Online (Sandbox Code Playgroud)

是一个有效的命令,并且:

REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"
Run Code Online (Sandbox Code Playgroud)

是一个损坏的命令(%a应该是%%a,等等)。

注意:

REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa"
Run Code Online (Sandbox Code Playgroud)

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

REM将在解析器的阶段 2 中处理,但它永远不会到达那里,因为%阶段 1 中的处理已经产生了错误并终止了解析。

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

  • 另一种看待它的方式:不要将 REM 视为注释,而是将其视为对其参数不执行任何操作的内部命令。 (23认同)

Mok*_*bai 11

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

对于“批处理”,您的第二行不正确,应阅读

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"
Run Code Online (Sandbox Code Playgroud)

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


Ral*_*edl 10

要添加到现有答案中,虽然REM用于评论,但重要的是要了解它实际上是一个什么都不做的命令,而不是评论。这与 Unix shell 不同,在 Unix shell 中您有真正的注释,并且可以在#字符后添加任意文本。

不仅会评估REM命令的替代品,还会评估文件重定向。所以要注意下面这行会删除文件的内容,因为REM命令没有输出,但是空的输出会被重定向到文件中

REM some_command > important_file
Run Code Online (Sandbox Code Playgroud)

编辑

正如评论指出的那样,现代 Windows 版本不再如此。根据/sf/answers/286659341/现在有特殊处理,REM以便不执行重定向,但这种特殊处理发生得太晚而无法做出REM真正的评论,因为替代品仍在评估中。

  • 您是否测试过所谓的重定向问题?具体如何?在什么操作系统?我的测试(到目前为止在 Win 7 中)没有确认这个问题,`important_file` 的内容仍然存在。[其他答案](/sf/answers/286659341/) 指出`REM` 在第2 阶段是特殊的,并且“处理方式截然不同”。我观察到的似乎证实了另一个答案,而不是你的。 (6认同)
  • 我打算为这篇文章点赞,因为实际上*回答*这个问题比任何其他答案都要好。但后来我看到,在看到一条评论指出您的帖子中有错误后,您在另一条评论中承认了这一点***但您没有编辑答案**。* (4认同)