如何创建批处理脚本,以便在达到文件夹大小限制时删除最旧的文件

时间:2011-07-28 10:11:51

标签: windows scripting batch-file windows-xp

我找到了很多类似问题的解决方案,但我想知道是否可以创建一个脚本,一旦达到预设的文件夹大小限制就删除最旧的文件?

1 个答案:

答案 0 :(得分:5)

你需要解决两个问题。

首先,您需要计算文件夹大小。使用类似于此

的代码
:foldersize
set sz=0
for %%F in (%1\*.*) do (
  set /a kb = %%~zF / 1024
  set /a sz = !sz! + !kb!  
  echo %%F %%~zF !kb! !sz!
)
goto :eof

其次,您需要识别旧文件并删除它们直到达到大小

for /F "tokens=*" %%F in ('dir /A-D /OD /B %1\*.*') do (
  if !sz! geq !targetsize! (
    call :filesize %1\%%F
    del %1\%%F
    set /a sz = !sz! - !kb!
  ) else (
    goto :eof
  )
) 
goto :eof  

:filesize
set /a kb = %~z1 / 1024
goto :eof

把所有部分放在一起......

@echo off
setlocal enabledelayedexpansion
set /a targetsize=%2
call :foldersize %1
for /F "tokens=*" %%F in ('dir /A-D /OD /B %1\*.*') do (
  if !sz! geq !targetsize! (
    call :filesize %1\%%F
    del %1\%%F
    set /a sz = !sz! - !kb!
  ) else (
    echo Done... %1 size is now !sz! KB
    goto :eof
  )
) 
echo Not completely done... %1 size is still !sz! KB 
goto :eof  

:filesize
set /a kb = %~z1 / 1024
goto :eof

:foldersize
set sz=0
for %%F in (%1\*.*) do (
  set /a kb = %%~zF / 1024
  set /a sz = !sz! + !kb!  
)
goto :eof

测试,测试和测试,因为它不会将文件移动到垃圾箱,但会永久删除文件。

此外,如果您要删除只读文件,则可能需要指定/F选项。

如果您在文件夹中有子文件夹,并且想要将这些子文件夹放入文件夹大小的帐户中,并且您想要删除旧文件,则事情可能会变得更复杂。

大小的计算是这个

:foldersizerecurse
set sz=0
for /F %%F in ('dir /OD /B *.*') do (
  set /a kb = %%~zF / 1024
  set /a sz = !sz! + !kb!  
  echo %%F %%~zF !kb! !sz!
)
goto :eof

删除旧文件..你需要管道'dir / S'命令输出按日期排序和排序。我觉得很累。