需要将给定类型(示例中为 csv)的任意数量的文件从 ./source 移动到 ./target 文件夹,并且:
- 移动的所有文件的总大小低于给定值 SrcMax
- 文件成对移动,因此“双胞胎”保持在一起
到目前为止的代码,移动所有文件,或者什么都不做
set DataLoc=d:\target
Set HoldLoc=d:\source
set SrcCount=0
set SrcSize=0
REM Set 2MB total volume to move
set SrcMax=2000000
FOR /F "TOKENS=*" %%a IN ('dir /A-D /O-D /B "%HoldLoc%"\*.csv') DO (
SET /A SrcCount += 1
SET /A SrcSize+=%%~za
oddn=%SrcCount% %% 2
if !SrcSize! LEQ %SrcMax% && !oddn!==0 (
MOVE /y "%HoldLoc%\%%a" "%DataLoc%"
)
)
编辑 1:此基于总大小移动文件的批处理提供了一些指导,但仍然缺少一些东西
添加更多信息:
源文件夹中的文件如下:
d:\source\base1-yyyymmddhhmm-data.csv(小于 100 MB)
d:\source\base1-yyyymmddhhmm-flag.csv(小于 200 KB)
d:\source\base2-yyyymmddhhmm-数据.csv
d:\source\base2-yyyymmddhhmm-flag.csv
...
目标文件夹为空
要求是将“数据”和相应的“标志”文件一起移动。它们是使用相同的“修改日期”创建的,因此可以根据此日期运行循环,并且所有文件将作为一对正确缩短。与“数据”相比,“标志”文件确实很小。
问题似乎是循环如何累积文件大小以与 SrcMax 进行比较。
修正了:
!源大小!LEQ %源最大%
(而不是 SrcCount)。
答案1
目前这是可行的,除了计数器确保“孪生”文件一起移动。
set DataLoc=d:\target
Set HoldLoc=d:\source
set SrcCount=0
set SrcSize=0
REM Set 2MB total volume to move
set SrcMax=2000000
FOR /F TOKENS^=* %%a IN ('dir /A-D /O-D /B "%HoldLoc%"\*.csv') DO (
SET /A SrcCount += 1
SET /A "SrcSize+=%%~za"
if !SrcSize! LEQ %SrcMax% (
MOVE /y "%HoldLoc%\%%~nxa" "%DataLoc%")
)
问题:当将 .bat 文件移动到另一个位置,保留相同的代码时,它会停止工作。为什么?