Windows命令在cmd中工作但不在.bat文件中工作

时间:2015-06-11 12:14:04

标签: 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

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

2 个答案:

答案 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