Windows 命令在 cmd 中有效,但在 .bat 文件中无效

标签 windows batch-file cmd

您好,我正在尝试创建 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/

相关文章:

windows - 如何使批处理脚本可以从任何地方执行?

batch-file - 使用单个命令重命名 FTP 中的文件

c# - 有没有一种在不知道文件扩展名的情况下确定文件类型的简单方法?

windows - 16 位程序是否在 32 位操作系统上以虚拟 8086 模式运行?

c++ - 我可以使用 try catch 语句来捕获任何错误而不是具体错误吗?

java - 以管理员身份运行时无法访问当前目录中的文件夹

node.js - 下一个 JS : Error: EPERM: operation not permitted, rmdir

windows - Windows 8.1 64 位的 NASM 问题

windows - 7zip 递归归档文件夹中的文件

java - 在 Windows 中使用 Java 为文本着色