如何编写按累计总大小批量移动文件的Windows批处理脚本
批处理修正方案
你之前的代码失效原因确实是仅统计文件数量,没有做文件大小的累加校验,修正后可满足累计大小凑够100MB即停止、仅移动单个大小≤10KB文件的要求,代码如下:
@echo off setlocal enabledelayedexpansion :: 基础参数配置 set "Source=C:\Users\%Username%\Desktop\Dropbox\Pre" set "Target=C:\Users\%Username%\Desktop\Dropbox\Pos" set "MaxTotalSizeMB=100" set "MaxSingleSizeKB=10" :: 单位转换为字节避免计算误差 set /a MaxTotalSizeBytes=MaxTotalSizeMB * 1048576 set /a CurrentTotalBytes=0 :: 遍历源目录文件,默认按创建时间从早到晚排序,可修改/o参数调整排序规则 for /f "delims=" %%a in ('dir /a-d /b /o:d "%Source%\*" 2^>nul') do ( set FileSize=%%~za :: 校验单个文件大小是否符合≤10KB要求 set /a SingleSizeLimit=MaxSingleSizeKB * 1024 if !FileSize! leq !SingleSizeLimit! ( :: 校验累加后是否超过总大小限制 set /a NewTotal=CurrentTotalBytes + FileSize if !NewTotal! gtr !MaxTotalSizeBytes! goto finishMove :: 执行移动 move /y "%Source%\%%a" "%Target%\" set CurrentTotalBytes=!NewTotal! ) ) :finishMove endlocal pause
逻辑说明
- 所有参数都可按需修改:如果不需要限制单个文件大小,把
MaxSingleSizeKB改为一个极大值即可;如果要调整总大小阈值,修改MaxTotalSizeMB的数值即可 - 默认按文件创建时间从早到晚排序移动,如需调整排序规则,修改
dir命令的/o参数:/o:-d:按创建时间从晚到早排序/o:n:按文件名字母顺序排序/o:s:按文件大小从小到大排序
- 累加大小一旦超过设置的100MB阈值就立刻停止移动,和手动选择文件凑总大小的效果完全一致
内容的提问来源于stack exchange,提问作者Caracks
相关产品推荐
相关产品推荐

