您好我正在尝试创建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
我正在尝试更改脚本来修复错误,但只有我实现的是即使在命令行中也停止工作。请帮忙。 :)
答案 0 :(得分:1)
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
答案 1 :(得分: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 ...
命令。净效果是"对每个文件执行start ...
命令,扩展名为.mkv"。最后一行:
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