windows上Bat脚本,轮询监视目录文件大小,超过上限就重启指定的服务

@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
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值