如何将多段MP4处理批处理脚本合并为单个优化脚本
合并优化后的MP4批量处理批处理脚本
以下是整合了全部五个操作的单一批处理脚本,针对数千文件场景做了IO优化,提升执行速度:
@echo off setlocal enabledelayedexpansion :: 可配置参数 - 根据需求修改 SET MAIN_DIR=%cd% SET BATCH_SIZE=60 :: 第一次分组:每个文件夹存放的MP4数量 SET FOLDER_BATCH=15 :: 第二次分组:每个父文件夹包含的子文件夹数量 SET TEMP_PREFIX=tmp_rnd_ :: 随机重命名的临时前缀,避免与原有文件名冲突 :: -------------------------- 步骤1:归集子文件夹MP4到主目录并删除空文件夹 -------------------------- echo 正在归集子文件夹中的MP4文件... for /r "%MAIN_DIR%" %%f in (*.mp4) do ( :: 跳过主目录下的MP4,只处理子文件夹中的 if not "%%~dpnf"=="%MAIN_DIR%\%%~nf" ( move /y "%%f" "%MAIN_DIR%\" >nul ) ) echo 正在清理空文件夹... :: 从最深层文件夹开始删除,确保父文件夹能被正确识别为空 for /f "delims=" %%d in ('dir /ad /b /s "%MAIN_DIR%" ^| sort /r') do ( rd "%%d" 2>nul ) :: -------------------------- 步骤2:随机重命名打乱文件顺序 -------------------------- echo 正在随机重命名MP4文件... for %%f in (*.mp4) do ( :RENAME_RETRY :: 生成高随机性的临时文件名,降低重名概率 SET RAND_NAME=!TEMP_PREFIX!!RANDOM!!RANDOM!!RANDOM! if exist "!RAND_NAME!.mp4" goto RENAME_RETRY ren "%%f" "!RAND_NAME!.mp4" ) :: -------------------------- 步骤3:计数重命名确保完全混合 -------------------------- echo 正在计数重命名MP4文件... SET SEQ_COUNT=1 for %%f in (!TEMP_PREFIX!*.mp4) do ( :: 生成4位序号,文件超过10000个可调整为5位(!NUM:~-5!) SET SEQ_NUM=0000!SEQ_COUNT! SET SEQ_NUM=!SEQ_NUM:~-4! ren "%%f" "!SEQ_NUM!.mp4" SET /A SEQ_COUNT+=1 ) :: -------------------------- 步骤4:按指定数量分组MP4到子文件夹 -------------------------- echo 正在按%BATCH_SIZE%个文件一组创建子文件夹... SET GROUP_NUM=1 SET FILE_CNT=0 for %%f in (*.mp4) do ( if !FILE_CNT! equ 0 ( SET GROUP_NAME=FILE_GROUP_!GROUP_NUM! mkdir "!GROUP_NAME!" >nul SET /A GROUP_NUM+=1 ) move "%%f" "!GROUP_NAME!\" >nul SET /A FILE_CNT+=1 if !FILE_CNT! equ %BATCH_SIZE% SET FILE_CNT=0 ) :: -------------------------- 步骤5:按指定数量二次分组文件夹 -------------------------- echo 正在按%FOLDER_BATCH%个文件夹一组创建父文件夹... SET PARENT_NUM=1 SET FOLDER_CNT=0 :: 遍历所有FILE_GROUP开头的子文件夹 for /f "delims=" %%d in ('dir /ad /b FILE_GROUP_*') do ( if !FOLDER_CNT! equ 0 ( SET PARENT_NAME=FOLDER_GROUP_!PARENT_NUM! mkdir "!PARENT_NAME!" >nul SET /A PARENT_NUM+=1 ) move "%%d" "!PARENT_NAME!\" >nul SET /A FOLDER_CNT+=1 if !FOLDER_CNT! equ %FOLDER_BATCH% SET FOLDER_CNT=0 ) echo 所有处理操作已完成! endlocal
优化说明
- 启用延迟变量扩展:解决循环中变量值无法实时更新的问题,避免逻辑错误,提升执行效率。
- 减少磁盘扫描:用
for /r一次性遍历所有子文件夹的MP4,避免重复扫描磁盘。 - 高效清理空文件夹:从最深层文件夹开始删除,确保父文件夹在子文件夹清空后能被正确识别并删除。
- 低冲突随机命名:三重
%RANDOM%生成临时文件名,配合循环重试机制,彻底避免重名问题。 - 批量IO操作:分组时每满指定数量才新建文件夹并移动文件,减少
mkdir和move的调用次数,降低磁盘IO开销。
内容的提问来源于stack exchange,提问作者Ionut Bejinariu
相关产品推荐
相关产品推荐

