Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows命令在cmd中工作,但不在.bat文件中_Windows_Batch File_Cmd - Fatal编程技术网

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

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文件中时,只能执行第一行和第三行 因为他说了这个错

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

我试图修改脚本来修复这个错误,但我唯一得到的是即使在命令行中也停止工作。请帮忙。:)

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让它工作在最后一行,你做了我想要的