如何使用COPY命令将文件夹中的所有MP3文件合并为一个MP3文件?

问题描述 投票:0回答:1

我尝试使用命令 COPY 将文件夹中的 *.mp3 文件合并为单个 MP3 文件,并使用选项

/b
合并文件。

到目前为止,我有这个命令,但我很难理解如何让它循环文件夹中的每个文件。

for /f "tokens=*" %a in ('"dir /b *.mp3"') do echo copy /b %a+%a final.mp3

我的文件夹是:

D:\data\mp3_files\song one.mp3
D:\data\mp3_files\song two.mp3

我以前可以在压缩每个文件的多个文件上执行此操作,但我不知道如何使用

copy /b
合并文件,因为文件数量未知。所以我不知道我会用多少个
+%a

语法为:

copy /b file1.mp3 + file2.mp3 targetfile.mp3

我的问题是我不知道如何将

file1.mp3 + file2.mp3
写为变量。

我有这个:

copy /b %a+%a final.mp3

我不知道要放多少次

%a
,因为我不知道目录中有多少个文件。

我也不知道为什么我要把同一个变量写两次。

不确定如何正确编码。

loops for-loop cmd copy binaryfiles
1个回答
1
投票

该文件合并任务可以使用以下代码通过批处理文件来完成:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.mp3 /A-D /B /ON 2^>nul') do copy /B "%%I" "TempFile.tmp" >nul & goto MergeFiles
:MergeFiles
for /F "skip=1 eol=| delims=" %%I in ('dir *.mp3 /A-D /B /ON 2^>nul') do copy /B "TempFile.tmp"+"%%I" "TempFile.tmp" >nul
if exist "TempFile.tmp" ren "TempFile.tmp" "final.mp3"
if exist "TempFile.tmp" del "TempFile.tmp"
endlocal

首先通过命令DIR将当前目录中的第一个MP3文件按文件名排序复制到

TempFile.tmp
。重要的是,临时文件的文件扩展名不是
.mp3
,否则临时文件也会出现在 MP3 文件列表中,由下一个 FOR 循环处理。

命令 GOTO 会导致在复制第一个 MP3 文件后退出第一个循环。

第二个 FOR 循环与第一个 FOR 循环类似,在后台执行另一个命令进程 DIR 以获取带有文件扩展名

.mp3
的文件名列表,按命令进程捕获的名称排序处理批处理文件并逐行处理,忽略 DIR 的输出中不存在的空行。

对于每个文件名,执行命令 COPY 将当前临时文件与列表中的当前 MP3 文件合并在一起,以创建一个附加当前 MP3 文件的新临时文件。

最后,将 MP3 文件一个接一个地附加到临时文件后,临时文件将被重命名为最终生成的 MP3 文件所需的名称,或者在删除临时文件时出现诸如

final.mp3
之类的错误情况。

如果 MP3 文件的数量不太大,也可以使用以下批处理文件,因此最终分配给环境变量的字符串

FileList
不会变得超过 8182 个字符,因为环境变量名称加上等号加上长度分配给环境变量的字符串加上以 null 结尾的字符串不能超过 8192 个字符。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileList="
for /F "eol=| delims=" %%I in ('dir *.mp3 /A-D /B /ON 2^>nul') do call :AppendFileName "%%I"
goto MergeFiles
:AppendFileName
set FileList=%FileList%+%1
goto :EOF
:MergeFiles
if not defined FileList exit /B
copy /B %FileList:~1% "final.mp3" >nul
endlocal

该批处理文件将

"
中包含的当前目录中找到的所有 MP3 文件的文件名连接到单个命令行,每个文件名之间使用
+
(也位于
FileList
字符串值的开头)并运行最后命令 COPY 以及所有文件名(没有第一个加号)将它们一次性合并到文件
final.mp3

具有最大字符串长度限制的第二种解决方案速度更快,因为在执行批处理文件时仅完成一次数据复制。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
  • copy /?
  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • if /?
  • goto /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.