【已解决】“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
想命令简单,就移动(复制)文件,补齐文件名为 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 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.最开始可能是命令写长了,没有任何错误信息,不知道是什么原因。
slore 发表于 2016-12-19 19:03
想命令简单,就移动(复制)文件,补齐文件名为 001.avi,002.avi之类的。
不然额外创建文件的话,拼接命令 ...
多谢,之前操作就是批量补充0,然后分批新建文件夹解决的,不过觉得有些麻烦,才想看是否能直接解决 本帖最后由 netmjwork 于 2016-12-19 19:42 编辑
不知 发表于 2016-12-19 19:15
试一下for命令
——————————————————————————
@echo off
多谢帮助,不过测试没有任何反应,是不是还得提前将数字补充0?测试和位数没关系,将10-30的放在一个文件夹,还是没有反应
比如:输入 5-15 ,回车之后窗口消失然后就没有任何反应了……
能解释下您这个批处理的流程吗?看不太懂,多谢!
修改 处理.bat 为 test.bat 也不行 我只想知道一点
楼主确定copy命令合并的视频文件正确,比如,时长?! 本帖最后由 netmjwork 于 2016-12-19 20:23 编辑
nttwqz 发表于 2016-12-19 19:59
我只想知道一点
楼主确定copy命令合并的视频文件正确,比如,时长?!
测试.ts正确,其它应该也行,你可以测试小片段
时长超过一个小时的可能会存在时间轴比实际时长偏大的问题,不过不影响使用 @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: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: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:10 编辑
不知 发表于 2016-12-19 21:13
要把批处理和视频文件放在同一目录下。
处理完成后,看有没有多出来out.avi
——————————— ...
谢谢,是放在同一个目录下的,目录名也是纯英文,但没有效果,不出来out.avi
没事儿,多谢备注解释,DOS方面不懂…… 什么压缩格式的视频可以酱紫简单合并的? netmjwork 发表于 2016-12-19 22:00
多谢,您这种是逐一叠加复制的方式,测试正常,可以无视数字排序格式的问题,思路不错~
另:用copy的 ...
其实吧,你只是需要个 菲菲更名宝贝而已
http://www.ffhome.com/works/1406.html
nttwqz 发表于 2016-12-19 22:21
其实吧,你只是需要个 菲菲更名宝贝而已
http://www.ffhome.com/works/1406.html
多谢!
批量命名的软件我有,也可以操作,现在就想用批处理的方式解决这个问题,更有针对性 本帖最后由 不知 于 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
____________________________________________________
文件:
不知 发表于 2016-12-19 22:28
添0已经解决。
代码:
————————————————————————————
非常感谢帮忙,辛苦了~ 窄口牛 发表于 2016-12-19 22:18
什么压缩格式的视频可以酱紫简单合并的?
可以自己测试下就知道了~ 本帖最后由 netmjwork 于 2016-12-19 23:06 编辑
不知 发表于 2016-12-19 22:28
添0已经解决。
代码:
————————————————————————————
非常感谢,分两步测试可以,不知道能不能放一个批处理里面来用,用暂停的方式?
刚简单的合并到一个批处理里面,“添加0”的过程没有运行…… 本帖最后由 不知 于 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本身会暂停。就不另外加暂停了。
netmjwork 发表于 2016-12-19 23:05
非常感谢,分两步测试可以,不知道能不能放一个批处理里面来用,用暂停的方式?
刚简单的合并到一个 ...
第二步输数字的时候也要添0. 好东西 不知 发表于 2016-12-20 08:41
合并后的代码:
——————————————————————————————
@echo off
感谢!
这个测试不行,也是没有运行“加0”的过程,还是用两个批处理分开处理的好用,互不影响,用vbs来调用
第二个“分组复制.bat”能不能添加一个循环?那样更方便
就是最后一步“分组复制的目录”之后添加一个“是否继续复制处理?”的判断,选“Y”的话可以不用退出批处理就再次操作一次,循环判断,这样就完美了
本帖最后由 不知 于 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
_________________________________________________________
文件:
不知 发表于 2016-12-20 12:22
不好意思,帖子中的文字打错了,把%1打成了%%i。帖子已更正。
——————————————————— ...
非常感谢!
DOS只能处理简单的,这种复杂的就只好求助了~
这下不用VBS调用了,很完美! 本帖最后由 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\
不知道好不好实现,再次麻烦您了~
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
————————————————————————————————————————————————
由于是在原文件基础上添加代码,就不上传文件了。 不知 发表于 2016-12-20 17:25
复制出来,加一条命令即可。
——————————————————————————————
@echo of ...
不用传文件,我复制下就好,十分感谢!
测试正常。 本帖最后由 netmjwork 于 2016-12-20 18:28 编辑
不知 发表于 2016-12-20 17:25
复制出来,加一条命令即可。
——————————————————————————————
@echo of ...
不用传文件,我复制下就好,十分感谢!
测试正常。
奇怪,网络有问题,回复一下出两个…… 世上没有绝望的处境,只有对处境绝望的人。http://d3.freep.cn/3tb_170106175331atsu581472.jpg
页:
[1]
2