【问题标题】:Windows command working in cmd but not in .bat fileWindows 命令在 cmd 中工作,但不在 .bat 文件中
【发布时间】:2015-06-11 12:14:04
【问题描述】:

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

我正在尝试更改脚本来修复错误,但我唯一实现的是即使在命令行中也停止工作。请帮忙。 :)

【问题讨论】:

  • findstr .*".mkv"$ 背后的想法是什么?
  • @npocmaka:第一个.* 是“任何字符零次或多次”的正则表达式,".mkv" 部分是文字“.mkv”,最后的$ 是“行尾”的正则表达式!

标签: windows batch-file cmd


【解决方案1】:

您的代码的问题是,当命令放入批处理文件时,您必须将百分号加倍,正如 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

【讨论】:

  • 谢谢你最后一行做的正是我想要的
【解决方案2】:

dir /b | findstr .*".mkv"$ > tmpFile 应该做什么(看起来像 javascript 正则表达式)?

在批处理文件中,您需要双 % 用于 FOR 令牌:

dir /b | findstr  /i /e ".mkv" > tmpFile
for /f "tokens=*" %%f in (tmpFile) do start mkvextract.exe tracks %%f 2:%%~nf.ass
del tmpFile

虽然它可以在没有临时文件的情况下完成:

for /f "tokens=*" %%f in ('dir /b ^| findstr  /i /e ".mkv"') do start mkvextract.exe tracks %%f 2:%%~nf.ass

【讨论】:

  • 谢谢你,我试图只做不带 ^ 的管道,但它没有用,所以我用 tempfile 让它工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多