如何在多路复用后使用* .tmp文件命名输出文件与原始文件相同?
当前目录及其子文件夹中的所有* .mkv,* .mp4和* .avi文件。
答案 0 :(得分:0)
你有没有想过你在这里尝试做什么:从文件中读取数据并同时将修改后的数据写入同一文件?这应该怎么做?
有些应用程序通过从文件test.mkv
读取来支持它,如果输出文件与输入文件相同,则将输出写入~test.tmp
之类的临时文件。处理完整个输入文件并将所有数据完全写入临时输出文件后,应用程序将删除输入文件并将临时输出文件重命名为输入文件名。
看起来mkvmerge
不支持这一点。因此,您需要一个批处理文件来完成此任务。
@echo off
if "%~1" == "" goto Help
if "%~1" == "/?" goto Help
if not "%~2" == "" (
if /I not "%~f1" == "%~f2" (
rem Optional output file specified being different to input file.
mkvmerge.exe "%~1" -o "%~2" --no-subtitles
goto :EOF
)
)
mkvmerge.exe "%~1" -o "%~dp1~%~n1.tmp" --no-subtitles
if errorlevel 1 goto :EOF
move /Y "%~dp1~%~n1.tmp" "%~1"
goto :EOF
:Help
echo %~nx0 inputfile [outputfile]
echo/
echo inputfile name of input file (required)
echo outputfile name of output file (optional)
echo/
echo The input file is replaced on no output file being specified.
echo/
pause
批处理文件必须使用test.mkv
执行,不带或带路径作为参数。
注1:我没有安装mkvmerge.exe
。因此,此批处理代码未与mkvmerge
命令行进行相关测试。我不知道mkvmerge
是否以此处使用的错误退出代码大于0来确定输入文件是否可以删除,并且可以使用命令 MOVE将临时输出文件重命名为输入文件就像使用 DEL 和 REN 。
注意2:如果输入文件确实存在并且是文件而不是文件夹,则可能会添加其他代码,或者在错误时删除临时文件但仍在{{1}之后存在的代码终止等等。
用于处理当前目录中的所有* .avi,* .mkv和* .mp4文件,并生成删除原始文件的* .mkv文件:
mkvmerge
用于处理当前目录和所有子目录中的所有* .avi,* .mkv和* .mp4文件,并生成删除原始文件的* .mkv文件:
@echo off
for /F "delims=" %%I in ('dir /A-D /B /ON *.avi *.mkv *.mp4 2^>nul') do (
mkvmerge.exe "%%~I" -o "~%%~nI.tmp" --no-subtitles
if not errorlevel 1 (
del "%%~I"
move /Y "~%%~nI.tmp" "%%~nI.mkv" >nul
)
)
命令 DIR 使用参数@echo off
for /F "delims=" %%I in ('dir /A-D /B /ON /S *.avi *.mkv *.mp4 2^>nul') do (
mkvmerge.exe "%%~I" -o "%%~dpI~%%~nI.tmp" --no-subtitles
if not errorlevel 1 (
del "%%~I"
move /Y "%%~dpI~%%~nI.tmp" "%%~dpnI.mkv" >nul
)
)
输出,而不仅仅是当前目录中匹配文件的名称,文件名包含整个目录树中任何匹配文件的完整路径。
出于这个原因,/S
在最后一批代码中引用了文件扩展名为且带有完整路径的文件名,而不仅仅是文件名和文件扩展名,因为命令的输出不同 DIR 强>
%%~I
扩展为"%%~dpI~%%~nI.tmp"
,而"Drive:\File path\~File name.tmp"
只展开为"~%%~nI.tmp"
。并且"~File name.tmp"
扩展为"%%~dpnI.mkv"
,而"Drive:\File path\File name.mkv"
只展开为"%%~nI.mkv"
。
这些小修改使上面的批处理文件适用于整个目录树中的所有文件。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
"File name.mkv"
call /?
del /?
dir /?
echo /?
for /?
goto /?
if /?
move /?
pause /?
另请阅读Microsoft有关Using Command Redirection Operators的文章,了解第二批代码中使用的rem /?
的说明,以禁止通过命令 DIR 输出错误消息来处理 STDERR 如果找不到与任何通配符模式匹配的文件,方法是将错误消息重定向到设备 NUL 。在此特殊情况下,重定向操作符2>nul
必须使用插入符>
进行转义,以便在解析 FOR 命令行时由Windows命令解释程序解释为文字字符,但稍后作为重定向运算符在单独的后台命令进程中通过 FOR 运行 DIR 命令行。
阅读Microsoft支持文章Testing for a Specific Error Level in Batch Files。