说明
此脚本是监测目标程序是否启动,如果目标程序未启动,脚本将会自启动目标程序,每隔5s监测一次目标程序的进程。此脚本未实现开机自动运行功能,电脑每次重启之后都需要手动执行一次vbs脚本。如果想要停止脚本,在任务管理器中找到“Windows命令处理程序”进程,结束此进程既停止脚本运行。
此功能的实现是通过bat(批处理文件)实现的,bat文件主要是实现监测程序自启动,vbs文件是实现启动以隐藏cmd窗口方式运行批处理文件。脚本是后台运行脚本,执行vbs之后是不会弹出命令行窗口的。如果想要弹出命令行窗口,就直接执行bat文件。
bat文件内容(监测程序自启动)
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
set "processName=认证测试程序.exe"
set "programPath=%~dp0%processName%"
:loop
tasklist /fi "imagename eq %processName%" 2>nul | find /i "%processName%" >nul
if errorlevel 1 (
echo [%date% %time%] 发现程序未运行,正在重启...
start "" "!programPath!"
)
timeout /t 5 /nobreak >nul
goto loop
解释:
- @echo off:关闭 命令回显,让批处理运行时不显示命令本身,只显示输出结果,减少屏幕上的杂乱信息。
- chcp 65001 >nul:设置 代码页(chcp) 为 UTF-8(65001),保证中文字符不会乱码。nul 表示抑制输出,即不显示 chcp 命令的结果。
- setlocal enabledelayedexpansion:启用“延迟变量扩展”,允许在 for、if 等语句中动态修改变量的值并立即生效(通常需要 !变量名! 访问)。
- set “processName=认证测试程序.exe”:定义目标进程,将认证测试程序.exe修改成目标程序名称。
- **set "programPath=%dp0%processName%"**:定义目标程序路径,%dp0 代表批处理脚本所在目录,保证获取的程序路径始终正确。
- :loop:定义一个循环标签 loop,用于后续跳转。
- tasklist /fi “imagename eq %processName%” 2>nul | find /i “%processName%” >nul:tasklist是用于获取正在运行的进程列表;/fi “imagename eq %processName%” 只筛选指定进程(认证测试程序.exe——既目标进程);2>nul 抑制错误输出;find /i “%processName%” 在 tasklist 输出中查找目标进程,/i 让 find 忽略大小写,>nul 抑制输出;
- if errorlevel 1 :如果 find 没有找到进程,则 errorlevel 变为 1,表示目标进程未运行,需要重启,执行括号中的内容。
- echo [%date% %time%] 发现程序未运行,正在重启…:输出当前日期时间以及“发现程序未运行,正在重启…”内容。
- start “” “!programPath!”:让 Windows 以新的窗口运行目标程序(认证测试程序.exe)
- timeout /t 5 /nobreak >nul:timeout /t 5 暂停 5 秒,避免频繁检查进程,减少 CPU 占用;/nobreak 禁止用户按 Ctrl + C 终止脚本;>nul 隐藏倒计时输出。
- goto loop:回到 :loop 继续检测,形成无限循环,确保程序始终在运行。
vbs文件内容(执行bat并隐藏命令行窗口)
Set ws = CreateObject("WScript.shell")
ws.Run "cmd /c RestartSinosecuRecog.bat", 0, False
解释:
- Set ws = CreateObject(“WScript.shell”):创建 Windows 脚本宿主(WScript Shell)对象,它可以执行 命令行指令,启动程序,管理注册表等。
- ws.Run:调用 WScript.shell 对象的 Run 方法,运行命令或程序。
- cmd:调用 命令提示符
- /c:执行 后续命令(这里是 执行bat),执行完成后立即关闭 cmd 窗口。
- 0:0 表示 隐藏窗口,即 cmd 不会弹出黑色窗口,完全在后台运行。其他可选值:1(正常窗口),2(最小化),3(最大化),6(最小化但激活)。
- False:不等待进程完成,代码会立即继续执行,不会等待 bat 执行完毕;如果是true,将会等待bat执行完成之后,再继续执行下去。