您好,我正在尝试创建 Windows 脚本来从目录中的所有 .mkv 文件中提取字幕,但我遇到了问题。
这是我的脚本:
dir /b | findstr .*".mkv"$ > tmpFile
for /f "tokens=*" %f in (tmpFile) do start mkvextract.exe tracks %f 2:%~nf.ass
del tmpFile
问题是,当我在 cmd.exe 中执行它时,一切正常,但是当我将它包装在 .bat 文件中时,只能执行第一行和第三行。
对于表示此错误的行
C:\test>dir /b | findstr .*".mkv"$ 1>tmpFile
The following usage of the path operator in batch-parameter
substitution is invalid: %~nf.ass
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
C:\test>for /f "tokens=*" f 2:n (tmpFile) do start
mkvextract.exe tracks %f 2:%~nf.ass
我试图更改脚本来修复错误,但我唯一实现的是即使在命令行中也停止工作。请帮忙。 :)
最佳答案
代码的问题在于,当命令放入批处理文件中时,必须将百分号加倍,正如 npocmaka 在他的答案中指出的那样。不过,我想稍微分析一下你的代码。在这一行中:
dir /b | findstr .*".mkv"$ > tmpFile
dir/b
命令生成文件名列表,findstr
命令仅获取以任意字符串开头并以“.mkv”结尾的名称,并且重定向将这些名称存储在“tmpFile”中。上一行的最终效果是“将扩展名为 .mkv 的文件名存储在 tmpFile 中”。 (使用 dir/b *.mkv > tmpFile
命令可能会得到相同的结果)。
第二行:
for /f "tokens=*" %f in (tmpFile) do start mkvextract.exe tracks %f 2:%~nf.ass
处理以前的名称,并为每个名称执行start ...
命令。最终效果是“对每个扩展名为 .mkv 的文件执行 start ...
命令”。最后一行:
del tmpFile
只需删除辅助文件即可。
使用此命令您可能会得到与前三行相同的结果:
for %f in (*.mkv) do start mkvextract.exe tracks %f 2:%~nf.ass
如果要将上一个命令放入批处理文件中,只需将百分号加倍即可:
for %%f in (*.mkv) do start mkvextract.exe tracks %%f 2:%%~nf.ass
关于Windows 命令在 cmd 中有效,但在 .bat 文件中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30780485/