我指的是问题使用批处理文件将文本添加到文件名末尾(但在扩展名之前)因为我有同样的问题。使用 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 被忽略”,但没有找到,所以我在这里发布了这个问题。我从未听说过或经历过命令处理器至少会尝试分析注释掉的行 - 并且如果注释符号后的代码有问题,它会终止批处理脚本。
答案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 保持谨慎。