netmjwork 发表于 2016-12-19 18:45:02

【已解决】“copy”命令合并视频文件,文件名纯数字排列,如何按指定范围合并?

本帖最后由 netmjwork 于 2016-12-20 13:29 编辑

要合并的文件名是连续的,从 0.ts 到 1200.ts (都是很小的片段),这些文件放在同一个文件夹里,文件名按位数分别是: 1.ts、2.ts (一位数),10.ts、11.ts(二位数),101.ts、102.ts(三位数),1001.ts、1002.ts(四位数),希望通过批处理合并指定范围的文件,比如只合并1-200的文件,或者只合并50-300、或400-1000的文件,求教如何实现?多谢!

使用copy命令来合并,比如:C:\>copy /b d:\test\*.ts d:\test\out.ts

目前存在两个问题:
① 由于文件名是从数字1-1200,如果直接使用上述命令的话会在排列顺序上出错,测试复制1-22的文件,结果如下:(会在很多地方排列错乱)
C:\>copy /b d:\test\*.ts d:\test\out.ts
d:\test\0.ts
d:\test\1.ts
d:\test\10.ts
d:\test\11.ts
……
d:\test\18.ts
d:\test\19.ts
d:\test\2.ts
d:\test\20.ts
d:\test\21.ts
d:\test\22.ts
d:\test\2.ts
d:\test\3.ts
……
d:\test\9.ts

② 不知道如何实现合并指定范围的视频文件,比如 8-100、200-500等等……

=========================================================   解决方案附加:

解决方案 一:见 8 楼“nttwqz”的回复,感谢“nttwqz”分享
优点:不用考虑文件数字位数不一致的问题,可以批量叠加复制并生成最终文件,适合较少数量的文件操作
缺点:由于是逐个叠加到缓存再次复制的方式,所以过多数量的文件操作不适合,比如我要操作的是1000多个


解决方案 二:(详见 15楼 ,多谢 “不知”的回复分享 !)

现在就想换个思路,全部用批处理不知道怎么实现如下过程的操作: 比如当前路径是: d:\test\      ,里面有1.ts - 1200.ts ,共1200个文件
1、自动将文件名全部重命名:(补充 0)
                        0-9    添加三个0 “000” ,0000.ts、0001.ts……
                     10-99   添加两个0“00” ,0010.ts、0099.ts……
                  100-999   添加一个0   “0” ,0100.ts、0999.ts……
               1000-9999保持原来编号,不变
2、将指定范围编号的文件剪切到当前路径下的指定文件夹,比如下面固定的格式:
      0000.ts - 0400.ts   剪切到当前路径下 ”01“文件夹    d:\test\01
      0400.ts - 0800.ts   剪切到当前路径下 ”02“文件夹    d:\test\02
      0800.ts - 1200.ts   剪切到当前路径下 ”03“文件夹    d:\test\03
3、接着再用copy命令来合成相应的文件,这样就容易且速度很快了,比如:
      copy /bd:\test\01\*.ts    d:\test\out_01.ts
      copy /bd:\test\02\*.ts    d:\test\out_02.ts
      copy /bd:\test\03\*.ts    d:\test\out_03.ts


slore 发表于 2016-12-19 19:03:11

想命令简单,就移动(复制)文件,补齐文件名为 001.avi,002.avi之类的。

不然额外创建文件的话,拼接命令 copy /b 1.avi+2.avi+3.avi+... out.avi
不过太多(100个?)的话,命令行参数长度不够,得分解。

copy /b 1.avi+2.avi+3.avi+5.avi tmp1.avi
copy /b tmp1.avi+6.avi+7.avi+8.avi+9.avi tmp2.avi
copy /b tmp2.avi+10.avi+11.avi+12.avi+13.avi tmp1.avi
...

不知 发表于 2016-12-19 19:15:20

本帖最后由 不知 于 2016-12-19 21:43 编辑

试一下for命令
——————————————————————————
@echo off

set /p start=请输入开始的序号:
set /p end=请输入结束的序号:
set /A start_fix=%start%
set /A end_fix=%end%




for /L %%i in (%end_fix%,-1,%start_fix%) do if exist %%i.avi (
if exist temp.avi copy /b %%i.avi+temp.avi temp_out.avi && move /Y temp_out.avi temp.avi
if not exist temp.avi copy /b %%i.avi temp.avi
)
if exist temp.avi move /Y temp.avi out.avi


——————————————————————————
把两个下划线以内的的内容保存为.bat文件,放在视频文件的目录里运行就行了。

注意:
1.一定要输入数字,否则可能会发生不可预知的错误。
2.最开始可能是命令写长了,没有任何错误信息,不知道是什么原因。

netmjwork 发表于 2016-12-19 19:24:18

slore 发表于 2016-12-19 19:03
想命令简单,就移动(复制)文件,补齐文件名为 001.avi,002.avi之类的。

不然额外创建文件的话,拼接命令 ...

多谢,之前操作就是批量补充0,然后分批新建文件夹解决的,不过觉得有些麻烦,才想看是否能直接解决

netmjwork 发表于 2016-12-19 19:31:55

本帖最后由 netmjwork 于 2016-12-19 19:42 编辑

不知 发表于 2016-12-19 19:15
试一下for命令
——————————————————————————
@echo off


多谢帮助,不过测试没有任何反应,是不是还得提前将数字补充0?测试和位数没关系,将10-30的放在一个文件夹,还是没有反应

比如:输入 5-15 ,回车之后窗口消失然后就没有任何反应了……

能解释下您这个批处理的流程吗?看不太懂,多谢!

修改 处理.bat 为 test.bat 也不行

nttwqz 发表于 2016-12-19 19:59:21

我只想知道一点

楼主确定copy命令合并的视频文件正确,比如,时长?!

netmjwork 发表于 2016-12-19 20:19:47

本帖最后由 netmjwork 于 2016-12-19 20:23 编辑

nttwqz 发表于 2016-12-19 19:59
我只想知道一点

楼主确定copy命令合并的视频文件正确,比如,时长?!

测试.ts正确,其它应该也行,你可以测试小片段

时长超过一个小时的可能会存在时间轴比实际时长偏大的问题,不过不影响使用

nttwqz 发表于 2016-12-19 21:08:28

@echo off
pushd %~dp0
set /p n=起始数字:
set /p end=结束数字:
copy %n%.avi out.avi
set num=%n%-%end%
:home
set /a n+=1
echo Y | copy /b out.avi+%n%.avi temp.avi && move /y temp.avi out.avi
if not %n%==%end% goto home
move /y out.avi out_%num%.avi
pause

本来我也想到了for /l,不过想到不知也用了for,于是我想,不妨换一个思路。
测试正常

不知 发表于 2016-12-19 21:13:51

本帖最后由 不知 于 2016-12-19 21:54 编辑

netmjwork 发表于 2016-12-19 19:31
多谢帮助,不过测试没有任何反应,是不是还得提前将数字补充0?测试和位数没关系,将10-30的放在一个文 ...

要把批处理和视频文件放在同一目录下。
处理完成后,看有没有多出来out.avi
——————————————————————————
流程:
1.用for生成一系列连续数字,并保存在变量%i中。
2.判断当前目录中%i.avi是否存在,如果不存在,结束本次循环。
3.判断当前目录中temp.avi是否存在,是则将%i.avi与temp.avi合并,否则将%i.avi复制到temp.avi。
4.所有数字循环结束后,将temp.avi重命名为out.avi.
————————————————————————————
不好意思,命令写长了出问题了。

netmjwork 发表于 2016-12-19 22:00:22

本帖最后由 netmjwork 于 2016-12-19 22:06 编辑

nttwqz 发表于 2016-12-19 21:08
本来我也想到了for /l,不过想到不知也用了for,于是我想,不妨换一个思路。
测试正常

多谢,您这种是逐一叠加复制的方式,测试正常,可以无视数字排序格式的问题,思路不错~
另:用copy的方式处理视频也是偶然知道的,好处是不用转换格式、无损、合并后的视频无缝连接

不过针对我的情况还不太适用,我要处理的是1000多个,那样就要操作1000次的复制、缓存、再复制的过程,这样对硬盘也不好; 刚测试复制60-110的片段,用您的批处理用时 23秒,单独将这些文件放一个文件夹直接copy命令用时2秒,时间差10倍

现在就想换个思路,全部用批处理不知道怎么实现如下过程的操作: 比如当前路径是: d:\test\
1、自动将文件名全部重命名:(补充0)
                        0-9    添加三个0 “000” ,0000.ts、0001.ts……
                     10-99   添加两个0“00” ,0010.ts、0099.ts……
                  100-999   添加一个0   “0” ,0100.ts、0999.ts……
               1000-9999保持原来编号,不变
2、将指定范围编号的文件剪切到当前路径下的指定文件夹,比如下面固定的格式:
      0000.ts - 0400.ts   剪切到当前路径下 ”01“文件夹    d:\test\01
      0400.ts - 0800.ts   剪切到当前路径下 ”02“文件夹    d:\test\02
      0800.ts - 1200.ts   剪切到当前路径下 ”03“文件夹    d:\test\03
3、接着再用copy命令来合成相应的文件,这样就容易且速度很快了,比如:
      copy /bd:\test\01\*.ts    d:\test\out_01.ts
      copy /bd:\test\02\*.ts    d:\test\out_02.ts
      copy /bd:\test\03\*.ts    d:\test\out_03.ts

   

netmjwork 发表于 2016-12-19 22:01:40

本帖最后由 netmjwork 于 2016-12-19 22:10 编辑

不知 发表于 2016-12-19 21:13
要把批处理和视频文件放在同一目录下。
处理完成后,看有没有多出来out.avi
——————————— ...

谢谢,是放在同一个目录下的,目录名也是纯英文,但没有效果,不出来out.avi
没事儿,多谢备注解释,DOS方面不懂……

窄口牛 发表于 2016-12-19 22:18:25

什么压缩格式的视频可以酱紫简单合并的?

nttwqz 发表于 2016-12-19 22:21:10

netmjwork 发表于 2016-12-19 22:00
多谢,您这种是逐一叠加复制的方式,测试正常,可以无视数字排序格式的问题,思路不错~
另:用copy的 ...

其实吧,你只是需要个 菲菲更名宝贝而已

http://www.ffhome.com/works/1406.html

netmjwork 发表于 2016-12-19 22:26:31

nttwqz 发表于 2016-12-19 22:21
其实吧,你只是需要个 菲菲更名宝贝而已

http://www.ffhome.com/works/1406.html

多谢!
批量命名的软件我有,也可以操作,现在就想用批处理的方式解决这个问题,更有针对性

不知 发表于 2016-12-19 22:28:43

本帖最后由 不知 于 2016-12-20 12:15 编辑

netmjwork 发表于 2016-12-19 22:00
多谢,您这种是逐一叠加复制的方式,测试正常,可以无视数字排序格式的问题,思路不错~
另:用copy的 ...
添0已经解决。
代码:
————————————————————————————
@echo off
rem 设置文件后缀名
set suf=ts



for /f %%i in ('dir /a /b *.%suf%') do call :deal %%i
goto :EOF

:deal
set temp=%1

if %temp:~1,1%x==.x move /Y %temp% 000%temp%
if %temp:~2,1%x==.x move /Y %temp% 00%temp%
if %temp:~3,1%x==.x move /Y %temp% 0%temp%
——————————————————————————————
添0:
分组复制,一会儿解决。
代码:
______________________________________________-
@echo off
rem 设置后缀名
set suf=ts

set /p start=分组开始的编号:
set /p end=分组结束的编号:
set /p dir=分组复制的目录:

if not exist %dir% mkdir %dir%

for /f %%i in ('dir /a /b *.%suf%') do call :deal %%i

copy /B %dir%\*.%suf% %dir%\out.%suf%

goto :EOF

:deal

set temp=%1

if %temp:~,4% GEQ %start% if %temp:~,4% LEQ %end% copy /B %temp% %dir%\%temp%

goto :EOF
____________________________________________________

文件:


netmjwork 发表于 2016-12-19 22:42:30

不知 发表于 2016-12-19 22:28
添0已经解决。
代码:
————————————————————————————


非常感谢帮忙,辛苦了~

netmjwork 发表于 2016-12-19 22:44:50

窄口牛 发表于 2016-12-19 22:18
什么压缩格式的视频可以酱紫简单合并的?

可以自己测试下就知道了~

netmjwork 发表于 2016-12-19 23:05:48

本帖最后由 netmjwork 于 2016-12-19 23:06 编辑

不知 发表于 2016-12-19 22:28
添0已经解决。
代码:
————————————————————————————


非常感谢,分两步测试可以,不知道能不能放一个批处理里面来用,用暂停的方式?

刚简单的合并到一个批处理里面,“添加0”的过程没有运行……

不知 发表于 2016-12-20 08:41:10

本帖最后由 不知 于 2016-12-20 12:15 编辑

netmjwork 发表于 2016-12-19 23:05
非常感谢,分两步测试可以,不知道能不能放一个批处理里面来用,用暂停的方式?

刚简单的合并到一个 ...

合并后的代码:
——————————————————————————————
@echo off
rem 设置文件后缀名
set suf=ts

goto :step1
:step1
for /f %%i in ('dir /a /b *.%suf%') do call :deal1 %%i
goto :step2

:deal1
set temp=%1

if %temp:~1,1%x==.x move /Y %temp% 000%temp%
if %temp:~2,1%x==.x move /Y %temp% 00%temp%
if %temp:~3,1%x==.x move /Y %temp% 0%temp%
goto :EOF

:step2
set /p start=分组开始的编号:
set /p end=分组结束的编号:
set /p dir=分组复制的目录:

if not exist %dir% mkdir %dir%

for /f %%i in ('dir /a /b *.%suf%') do call :deal2 %%i

copy /B %dir%\*.%suf% %dir%\out.%suf%

goto :EOF

:deal2

set temp=%1

if %temp:~,4% GEQ %start% if %temp:~,4% LEQ %end% copy /B %temp% %dir%\%temp%

goto :EOF
____________________________________
由于set本身会暂停。就不另外加暂停了。

不知 发表于 2016-12-20 08:44:04

netmjwork 发表于 2016-12-19 23:05
非常感谢,分两步测试可以,不知道能不能放一个批处理里面来用,用暂停的方式?

刚简单的合并到一个 ...

第二步输数字的时候也要添0.

窄口牛 发表于 2016-12-20 10:12:59

好东西

netmjwork 发表于 2016-12-20 11:33:11

不知 发表于 2016-12-20 08:41
合并后的代码:
——————————————————————————————
@echo off


感谢!
这个测试不行,也是没有运行“加0”的过程,还是用两个批处理分开处理的好用,互不影响,用vbs来调用

第二个“分组复制.bat”能不能添加一个循环?那样更方便
就是最后一步“分组复制的目录”之后添加一个“是否继续复制处理?”的判断,选“Y”的话可以不用退出批处理就再次操作一次,循环判断,这样就完美了

不知 发表于 2016-12-20 12:22:58

本帖最后由 不知 于 2016-12-20 12:31 编辑

netmjwork 发表于 2016-12-20 11:33
感谢!
这个测试不行,也是没有运行“加0”的过程,还是用两个批处理分开处理的好用,互不影响,用vbs来 ...
不好意思,帖子中的文字打错了,把%1打成了%%i。帖子已更正。
——————————————————————————————————————
@echo off
rem 设置文件后缀名
set suf=ts

goto :step1
:step1
for /f %%i in ('dir /a /b *.%suf%') do call :deal1 %%i
goto :step2

:deal1
set temp=%1

if %temp:~1,1%x==.x move /Y %temp% 000%temp%
if %temp:~2,1%x==.x move /Y %temp% 00%temp%
if %temp:~3,1%x==.x move /Y %temp% 0%temp%
goto :EOF

:step2
set /p start=分组开始的编号:
set /p end=分组结束的编号:
set /p dir=分组复制的目录:

if not exist %dir% mkdir %dir%

for /f %%i in ('dir /a /b *.%suf%') do call :deal2 %%i

copy /B %dir%\*.%suf% %dir%\out.%suf%

set /p ch=想要继续吗(Y/N(默认Y))?
if not defined ch goto :step2
if defined ch if /I %ch:~,1%==N exit
if defined ch if /I %ch:~,1%==Y goto :step2



goto :EOF

:deal2

set temp=%1

if %temp:~,4% GEQ %start% if %temp:~,4% LEQ %end% copy /B %temp% %dir%\%temp%

goto :EOF
_________________________________________________________

文件:

netmjwork 发表于 2016-12-20 13:28:21

不知 发表于 2016-12-20 12:22
不好意思,帖子中的文字打错了,把%1打成了%%i。帖子已更正。
——————————————————— ...

非常感谢!
DOS只能处理简单的,这种复杂的就只好求助了~
这下不用VBS调用了,很完美!

netmjwork 发表于 2016-12-20 16:52:05

本帖最后由 netmjwork 于 2016-12-20 16:53 编辑

不知 发表于 2016-12-20 12:22
不好意思,帖子中的文字打错了,把%1打成了%%i。帖子已更正。
——————————————————— ...

还有点儿小问题请教“不知”大师,不知道好不好解决:
能不能将后一个批处理每次生成的文件位置和名字做个改变?

目前情况是,操作目录:d:\test\
                  生成的文件夹 d:\test\01、02、03……
                  生成的文件都是out.ts,且分别在不同的分目录里,但操作的目录是 d:\test,这样就还要把几个out.ts重命名剪切出来,也不太方便,希望能够直接将每次生成的“.ts”文件直接命名成新建文件夹的名字+out的组合,比如“out_01.ts、out_02.ts”,生成后就直接放在当前目录下 d:\test\

不知道好不好实现,再次麻烦您了~

不知 发表于 2016-12-20 17:25:31

netmjwork 发表于 2016-12-20 16:52
还有点儿小问题请教“不知”大师,不知道好不好解决:
能不能将后一个批处理每次生成的文件位置和名字 ...

复制出来,加一条命令即可。
——————————————————————————————
@echo off
rem 设置文件后缀名
set suf=ts

goto :step1
:step1
for /f %%i in ('dir /a /b *.%suf%') do call :deal1 %%i
goto :step2

:deal1
set temp=%1

if %temp:~1,1%x==.x move /Y %temp% 000%temp%
if %temp:~2,1%x==.x move /Y %temp% 00%temp%
if %temp:~3,1%x==.x move /Y %temp% 0%temp%
goto :EOF

:step2
set /p start=分组开始的编号:
set /p end=分组结束的编号:
set /p dir=分组复制的目录:

if not exist %dir% mkdir %dir%

for /f %%i in ('dir /a /b *.%suf%') do call :deal2 %%i

copy /B %dir%\*.%suf% %dir%\out.%suf%

rem 移动文件当前目录

if exist %dir% move /Y %dir%\out.%suf% out_%dir%.%suf%

rem 如要删出中间文件/文件夹,请将下一行的rem删除

rem if exist %dir% RD /S /Q %dir%

set /p ch=想要继续吗(Y/N(默认Y))?
if not defined ch goto :step2
if defined ch if /I %ch:~,1%==N exit
if defined ch if /I %ch:~,1%==Y goto :step2



goto :EOF

:deal2

set temp=%1

if %temp:~,4% GEQ %start% if %temp:~,4% LEQ %end% copy /B %temp% %dir%\%temp%

goto :EOF
————————————————————————————————————————————————

由于是在原文件基础上添加代码,就不上传文件了。

netmjwork 发表于 2016-12-20 18:25:30

不知 发表于 2016-12-20 17:25
复制出来,加一条命令即可。
——————————————————————————————
@echo of ...

不用传文件,我复制下就好,十分感谢!
测试正常。

netmjwork 发表于 2016-12-20 18:25:30

本帖最后由 netmjwork 于 2016-12-20 18:28 编辑

不知 发表于 2016-12-20 17:25
复制出来,加一条命令即可。
——————————————————————————————
@echo of ...

不用传文件,我复制下就好,十分感谢!
测试正常。
奇怪,网络有问题,回复一下出两个……

itNHy295 发表于 2017-1-11 22:16:09

世上没有绝望的处境,只有对处境绝望的人。http://d3.freep.cn/3tb_170106175331atsu581472.jpg

Superxiaokui 发表于 2017-3-30 16:07:27

页: [1] 2
查看完整版本: 【已解决】“copy”命令合并视频文件,文件名纯数字排列,如何按指定范围合并?