Windows 10 批处理脚本:实时监测文件夹大小

功能

监测系统文件夹占用磁盘容量大小,如超过设置的容量值,则自动将其监测文件夹下的文件全部删除。

运行环境

Windows 10

注:如在 Windows 7 系统中运行,需要将脚本第二行 chcp 65001 代码删除掉,并将脚本中的中文提示改为英文。

脚本内容

@echo off & cd /d "@~dp0"
chcp 65001
set BatTitle=监测文件夹大小
color 0a & mode 55,5 & title %BatTitle%
setlocal enabledelayedexpansion
65
::设置需要监测的文件夹路径
set Folder=E:\Test

::设置最大允许的文件大小,格式为 1G 1M 1K 或dao 1B
set Size=2M

::设置延时等待时间,格式为 1h 1m 或 1s
set Interval=1m

::设置是否启用管理员权限,此功能针对开启了UAC保护机制的系统,
::如果要对有权限的文件(夹)进行处理,可能需要开启此功能。
::数字 1 为开启,其它内容为不启用
set UAC=0

if not defined Folder (
 echo 您尚未预设文件夹路径,请按任意键退出后,进行设置。
 pause>nul & exit
 )
else (
 if not exist "!Folder!" (
  echo 您预设的文件夹路径不存在,请按任意键退出后,进行设置.
  pause>nul & exit
  )
 else (
  dir /ad "!Folder!" >nul 2>nul || (
   echo 您预设的路径不是文件夹,请按任意键退出后,进行设置。
   pause>nul & exit
   )
  )
 )

if not defined Size (
 echo 您尚未预设文件大小,请按任意键退出后,进行设置。
 pause>nul & exit
)

if /i "!Size:~-1!"=="G" (
 set Size=!Size:~,-1!
 set /a Size*=1073741824
) else (
 if /i "!Size:~-1!"=="M" (
  set Size=!Size:~,-1!
  set /a Size*=1048576
 ) else (
  if /i "!Size:~-1!"=="K" (
   set Size=!Size:~,-1!
   set /a Size*=1024
  ) else (
   if /i "!Size:~-1!"=="B" (
    set Size=!Size:~,-1!
   ) else (
    echo 您预设的文件大小格式不符合标准,请按任意键退出后,进行重新设置。
    pause>nul & exit
   )
  )
 )
)

if not defined Interval (
 echo 您尚未预设延迟等待时间,请按任意键退出后,进行设置。
 pause>nul & exit
)

if /i "!Interval:~-1!"=="h" (
 set Interval=!Interval:~,-1!
 set /a Interval*=3600
) else (
 if /i "!Interval:~-1!"=="m" (
  set Interval=!Interval:~,-1!
  set /a Interval*=60
 ) else (
  if /i "!Interval:~-1!"=="s" (
   set Interval=!Interval:~,-1!
  ) else (
   echo 您预设的延迟等待时间格式不符合标准,请按任意键退出后,进行重新设置。
   pause>nul & exit
  )
 )
)

if exist "%SystemRoot%\System32\timeout.exe" (
 set WaitTime=timeout /t %Interval% /nobreak
) else (
 if exist "%SystemRoot%\System32\waitfor.exe" (
  set WaitTime=waitfor WaitTime /t %Interval%
 ) else (
  if exist "%SystemRoot%\System32\cscript.exe" (
   set "YMQY=!AppData!\YiMengQinYao"
   if not exist "!YMQY!" md "!YMQY!"
   (echo On Error Resume Next
   echo Wscript.Sleep WScript.Arguments^(0^) * 1000
   echo Wscript.Quit)>"!YMQY!\WaitTime.vbs"
   set WaitTime=cscript /nologo "!YMQY!\WaitTime.vbs" "!Interval!" 
  ) else (
   if exist "%SystemRoot%\System32\ping.exe" (
    set /a Interval+=2
    set WaitTime=ping 127.0.0.1 -n "!Interval!"
   ) else (
    echo 当前系统缺少用于延时等待的相关进程,按下任意
    echo 键后,脚本会继续执行,但不会启用延时功能。
    pause>nul
   )
  )
 )
)

if "%UAC%"=="1" goto GetAdmin

:Loop
cls & title !BatTitle! -- 正在监测中
if defined Count (
 echo 已经检测 !Count! 次
 echo,
)
set AllSize=0
for /f "delims=" %%a in ('dir /a-d/s/b/o-s "%Folder%\*" 2^>nul'do (
 set /a AllSize+=%%~za
 if !AllSize! gtr !Size! goto EmptyFolder
)
goto WaitTime

:EmptyFolder
title !BatTitle! -- 正在删除中
rd /s /q "%Folder%" >nul 2>nul || (
    echo 文件(夹)可能被占用无法正常删除。
)

:MdDir
if not exist "%Folder%" (
    md "%Folder%"else (
 goto WaitTime
)
goto MdDir

:WaitTime
title !BatTitle! -- 监测中
!WaitTime! >nul 2>nul
set /a Count+=1
goto Loop

:GetAdmin
>nul 2>&1 "%SystemRoot%\System32\cacls.exe" "%SystemRoot%\System32\config\SYSTEM"
if '%errorlevel%' NEQ '0' (
 echo 正在请求临时管理员权限...
 goto UACPrompt
) else ( goto Loop )

:UACPrompt
start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0","","runas",1)(window.close)&&exit

发布者

常轩

总要做点什么吧!

发表评论

邮箱地址不会被公开。 必填项已用*标注