Windows命令在cmd中工作,但不在.bat文件中
您好,我正在尝试创建windows脚本,以便从目录中的所有.mkv文件中提取字幕,但遇到了问题 这是我的剧本:Windows命令在cmd中工作,但不在.bat文件中,windows,batch-file,cmd,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文件中时,只能执行第一行和第三行 因为他说了这个错
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
我试图修改脚本来修复这个错误,但我唯一得到的是即使在命令行中也停止工作。请帮忙。:) dir/b | findstr.*.mkv“$>tmpFile应该做什么(看起来像javascript正则表达式) 在批处理文件中,您需要双
%
用于令牌:
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
代码的问题在于,当命令放入批处理文件中时,必须将百分号加倍,正如Npcmaka在回答中所指出的那样。不过,我想稍微分析一下您的代码。在这方面:
dir /b | findstr .*".mkv"$ > tmpFile
dir/b
命令生成文件名列表,findstr
命令只获取以任何字符串开头并以“.mkv”结尾的名称,重定向将这些名称存储在“tmpFile”中。前一行的净效果是“在tmpFile中存储扩展名为.mkv的文件名”。(使用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
findstr.*.mkv“$
?@npocmaka:第一个*
是“任意字符零次或多次”的regexp,“.mkv”
部分是文字.mkv”,末尾的$
是“行尾”的regexp!谢谢,我试着只做管道而不做括号中的^i,但它不工作,所以我用tempfile让它工作在最后一行,你做了我想要的