@echo on & cd /d "%~dp0"
set BatTitle=文件数量监控
color 0a & mode 55,5 & title %BatTitle%
setlocal enabledelayedexpansion
::设置需要监测的文件夹路径
set Folder=D:\tmp
::设置最大允许的文件夹文件数量
set total=200
::设置服务端口
set port=8090
::每个函数执行休眠时间 单位是秒
set timeInterval=20
::日志目录
set logDir=D:\monitorDir\monitorDirLog\
::日志文件名称
set logFileName=log.txt
::设置延时等待时间,格式为 1h 1小时 1m 分钟 或 1s 秒
set Interval=1h
::设置服务名称
set serviceName=server_8090
set filePath=%logDir%%Date:~0,4%%Date:~5,2%%Date:~8,2%%logFileName%
::创建日志目录
if not exist "%logDir%" (
md "%logDir%"
)
::设置是否启用管理员权限,此功能针对开启了UAC保护机制的系统,
::如果要对有权限的文件(夹)进行处理,可能需要开启此功能。
::数字 1 为开启,其它内容为不启用。
set UAC=0
if not exist "!logDir!" (
echo 您预设的日志目录不存在,请按任意键退出后,进行设置。>>%filePath%
pause>nul & exit
)
if not defined Folder (
echo 您尚未预设文件夹路径,请按任意键退出后,进行设置。>>%filePath%
pause>nul & exit
) else (
if not exist "!Folder!" (
echo 您预设的文件夹路径不存在,请按任意键退出后,进行设置。>>%filePath%
pause>nul & exit
) else (
dir /ad "!Folder!" >nul 2>nul || (
echo 您预设的路径不是文件夹,请按任意键退出后,进行设置。>>%filePath%
pause>nul & exit
)
)
)
if not defined total (
echo 您尚未预设文件大小,请按任意键退出后,进行设置。>>%filePath%
pause>nul & exit
)
if not defined Interval (
echo 您尚未预设延迟等待时间,请按任意键退出后,进行设置。>>%filePath%
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 您预设的延迟等待时间格式不符合标准,请按任意键退出后,进行重新设置。>>%filePath%
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 >>%filePath%
echo Wscript.Quit)>"!YMQY!\WaitTime.vbs" >>%logFileName%
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 当前系统缺少用于延时等待的相关进程,按下任意 >>%filePath%
echo 键后,脚本会继续执行,但不会启用延时功能。>>%filePath%
pause>nul
)
)
)
)
timeout /t 600
if "%UAC%"=="1" goto GetAdmin
set filePath=%logDir%%Date:~0,4%%Date:~5,2%%Date:~8,2%%logFileName%
:Loop
cls & title !BatTitle! -- 正在监测中
if defined Count (
echo 已监测 %Count% 次。 >>%filePath%
echo,
)
set filePath=%logDir%%Date:~0,4%%Date:~5,2%%Date:~8,2%%logFileName%
echo %Date% %time% >>%filePath%
set allTotal=0
for /f "delims=:" %%a in ('dir /b "%Folder%\*.txt" ^| findstr /n .*') do set allTotal=%%a
echo %Folder%文件夹中有[%allTotal%]个文件 >>%filePath%
if %allTotal% geq %total% (
echo 文件有积压,重启服务 >>%filePath%
goto netStopService
) else (
echo %Folder%文件夹中有[%allTotal%]个文件,没有文件积压,无需重启服务 >>%filePath%
timeout /t %timeInterval%
goto WaitTime
)
::启动服务
:netStartService
title !BatTitle! -- 启动服务中
echo 启动服务%serviceName% 端口 %port% >>%filePath%
net start %serviceName% >>%filePath%
timeout /t %timeInterval%
goto WaitTime
::关闭服务
:netStopService
title !BatTitle! -- 暂停服务中
echo 关闭服务 %serviceName% 端口 %port% >>%filePath%
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
::echo kill the process %%m who use the port
::taskkill /pid %%m -t -f
net stop %serviceName% >>%filePath%
)
timeout /t %timeInterval%
goto netStartService
::goto MdDir
:WaitTime
title !BatTitle! -- 等待中
echo 正在等待下一次检测。>>%filePath%
!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 正在请求临时管理员权限... >>%filePath%
goto UACPrompt
) else ( goto Loop )
:UACPrompt
start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0","","runas",1)(window.close)&&exit
windows上Bat脚本,轮询监视目录文件大小,超过上限就重启指定的服务
最新推荐文章于 2023-07-05 14:38:04 发布
这是一个Windows批处理脚本,用于监控指定文件夹中的文件数量。当文件数量超过预设阈值时,它将停止并重新启动指定的服务。脚本还包含了延迟等待功能,并记录日志。此外,它检查了必要的环境和参数设置,确保正确运行。
摘要由CSDN通过智能技术生成