如何使用命令提示符以正确的顺序合并文件

时间:2018-11-18 21:59:52

标签: batch-file cmd merge concatenation command-prompt

我有一个文件夹,其中包含来自mpeg-dash视频的视频片段。 有一个“ init.mp4”文件以及275个段,即“ seg-1.m4s”,“ seg-2.m4s”等。我想将它们合并到一个文件中。 我在cmd中使用以下命令: copy /b init.mp4 + seg-*.m4s source.mp4 上面的代码以错误的顺序合并文件。 see the merge order

如何以正确的顺序合并文件,例如1,2,3 ... 9,10,11..19,20 ...

还请注意,我尝试使用循环将它们一一合并。但这比上面的代码要慢

3 个答案:

答案 0 :(得分:2)

一个非常简单的纯批处理文件解决方案:

@echo off
setlocal EnableDelayedExpansion

rem Sort file names in numerical order
for /F "tokens=1,2 delims=-." %%a in ('dir /B *.m4s') do (
   set /A "num=1000+%%b"
   set "file[!num!]=%%a-%%b.m4s"
)

rem Create the ordered list
set "files=init.mp4"
for /F "tokens=2 delims==" %%a in ('set file[') do set "files=!files! + %%a"

rem Do it
copy /B %files% source.mp4

答案 1 :(得分:1)

这可以很容易地完成。将此代码放在名为mp4match.ps1的文件中。此代码的关键是对文件名中的数值进行排序。它是由regex提取的。

$segments = Get-ChildItem -File -Filter 'seg-*.mps' |
    Sort-Object @{Expression={([int]([regex]::match($_.Name, 'seg\-(\d*).mps')).Groups[1].Value)}} |
    ForEach-Object { $_.Name }

'init.mp4 ' + $segments -join ' '

然后,使用此批处理文件运行它。当COPY命令看起来正确时,请删除该行开头的ECHO

FOR /F "delims=" %%f IN ('powershell -NoProfile -File .\mp4match.ps1') DO (
    SET "FILE_LIST=%%f"
)
IF EXIST ".\source.mp4" (DEL ".\source.mp4")
COPY /Y %FILE_LIST% source.mp4

答案 2 :(得分:0)

我认为您需要重命名文件:

 1 -  9 to 001 - 009:
10 - 99 to 010 - 099:

在cmd中:

for /l %l in (1 1 9) do @ren seg-%l.m4s seg-00%l.m4s
for /l %l in (10 1 99) do @ren seg-%l.m4s seg-0%l.m4s

并在批处理文件中:

for /l %%l in (1 1 9) do ren seg-%%l.m4s seg-00%%l.m4s
for /l %%l in (10 1 99) do ren seg-%%l.m4s seg-0%%l.m4s

此后,运行代码:

copy /b init.mp4 + seg-*.m4s source.mp4