批处理 - 如何使用.tmp文件在多路复用后将输出命名为输入?

时间:2017-06-15 17:32:41

标签: windows batch-file command-line cmd

如何在多路复用后使用* .tmp文件命名输出文件与原始文件相同?

当前目录及其子文件夹中的所有* .mkv,* .mp4和* .avi文件。

1 个答案:

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