我参考使用批处理文件将文本添加到文件名末尾(但在扩展名之前)的问题,因为我有同样的问题。使用带有所有更新的 Windows 7 32 位企业版(我知道,我知道......)我编写了一个pdfrename.bat
只有三行的小批处理文件:
一条评论,从行的右边开始,
REM
并且没有“隐藏的”延续符号建议的命令,从@Karan 提供的源代码复制粘贴,注释掉
REM
采用的批处理命令(加倍
%
):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 被忽略”,但没有运气,所以我在这里发布了这个问题。在此之前,我从未听说过或经历过命令处理器至少会尝试分析注释掉的行——如果在注释符号之后代码有问题,它会终止批处理脚本。
错误消息指的是注释掉的第二行
这是由于用于
cmd
处理脚本的非常复杂的解析。简而言之,解析器
%
在几乎所有其他内容(阶段 1)之前处理并抛出错误,因为某些%
s 需要与%%
在批处理文件中使用时一样加倍。所以在一个批处理文件中:
是一个有效的命令并且:
是一个损坏的命令(
%a
应该是%%a
等)。注意:
从命令行运行时是一个有效的命令,因为
%
不需要加倍。REM
将在解析器的第 2 阶段处理,但它永远不会到达那里,因为第%
1 阶段的处理已经产生了错误并终止了解析。有关
cmd
解析器的所有血腥细节,请阅读解析 - Windows 命令解释器 (CMD.EXE) 如何解析脚本?- 堆栈溢出它不起作用,因为即使它被“注释”,它也会被评估为替换,然后显然被丢弃。
对于“批处理”,您的第二行不正确,应阅读
更正是在批处理编程扩展中需要有 %% 而不是单个 %。
要添加到现有答案,虽然
REM
用于评论,但重要的是要了解它实际上是一个什么都不做的命令,而不是评论。这与 Unix shell 不同,在 Unix shell 中,您有真正的注释,并且可以在#
字符后添加任意文本。不仅为
REM
命令评估替代品,还评估文件重定向。所以要注意下面这行会删除文件的内容,因为REM
命令没有输出,但是空的输出会被重定向到文件编辑
正如评论指出的那样,现代 Windows 版本不再适用。根据https://stackoverflow.com/a/4095133/10765659,现在有特殊处理,
REM
以便不执行重定向,但这种特殊处理发生得太晚,无法做出REM
真正的评论,因为替代品仍在评估中。