欢迎光临瑞安九九信息网
详情描述
使用vbs脚本来监控windows服务器上的应用程序(不存在就启动)

基础监控脚本 (AppMonitor.vbs)

Option Explicit

' 配置区域
Const APP_NAME = "notepad.exe"           ' 要监控的进程名
Const APP_PATH = "C:\Windows\notepad.exe" ' 应用程序完整路径
Const CHECK_INTERVAL = 5000               ' 检查间隔(毫秒)
Const LOG_FILE = "C:\MonitorLog.txt"      ' 日志文件路径

Dim fso, shell, wmiService
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
Set wmiService = GetObject("winmgmts:\\.\root\cimv2")

' 日志函数
Sub WriteLog(message)
    Dim logStream
    Set logStream = fso.OpenTextFile(LOG_FILE, 8, True) ' 8 = 追加模式
    logStream.WriteLine Now & " - " & message
    logStream.Close
End Sub

' 检查进程是否存在
Function IsProcessRunning(processName)
    Dim processes
    On Error Resume Next
    Set processes = wmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & processName & "'")
    IsProcessRunning = (processes.Count > 0)
    On Error GoTo 0
End Function

' 启动应用程序
Sub StartApplication()
    Dim result
    On Error Resume Next

    ' 检查文件是否存在
    If Not fso.FileExists(APP_PATH) Then
        WriteLog "错误: 应用程序不存在 - " & APP_PATH
        Exit Sub
    End If

    ' 启动应用程序
    result = shell.Run(APP_PATH, 1, False) ' 1=普通窗口, False=异步执行
    If Err.Number = 0 Then
        WriteLog "已启动: " & APP_NAME & " (" & APP_PATH & ")"
    Else
        WriteLog "启动失败: " & APP_NAME & " - 错误: " & Err.Description
    End If

    On Error GoTo 0
End Sub

' 主监控循环
Sub MonitorApp()
    WriteLog "监控开始 - 目标进程: " & APP_NAME

    Do
        If Not IsProcessRunning(APP_NAME) Then
            WriteLog "检测到 " & APP_NAME & " 未运行"
            StartApplication
        End If

        ' 等待下一次检查
        WScript.Sleep CHECK_INTERVAL
    Loop
End Sub

' 启动监控
MonitorApp

增强版脚本(带更多功能)

Option Explicit

' ============ 配置区域 ============
' 要监控的应用程序列表(可以监控多个应用)
Dim apps(2) ' 定义数组大小
Set apps(0) = CreateApp("notepad.exe", "C:\Windows\notepad.exe")
Set apps(1) = CreateApp("calc.exe", "C:\Windows\System32\calc.exe")
' 可以继续添加...

' 监控设置
Const CHECK_INTERVAL = 10000             ' 检查间隔(10秒)
Const MAX_RESTART_ATTEMPTS = 3           ' 最大重启尝试次数
Const LOG_FILE = "C:\Logs\AppMonitor.log"
Const ERROR_LOG_FILE = "C:\Logs\AppMonitor_Error.log"

' ============ 初始化 ============
Dim fso, shell, wmiService, restartCount
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
Set wmiService = GetObject("winmgmts:\\.\root\cimv2")
restartCount = 0

' ============ 辅助函数 ============
' 创建应用程序对象
Function CreateApp(name, path)
    Dim app
    Set app = CreateObject("Scripting.Dictionary")
    app.Add "Name", name
    app.Add "Path", path
    app.Add "IsRunning", False
    app.Add "StartTime", Null
    Set CreateApp = app
End Function

' 创建日志目录
Sub CreateLogDirectory(logPath)
    Dim folderPath
    folderPath = fso.GetParentFolderName(logPath)
    If Not fso.FolderExists(folderPath) Then
        On Error Resume Next
        fso.CreateFolder folderPath
        On Error GoTo 0
    End If
End Sub

' 日志函数
Sub WriteLog(message, isError)
    Dim logStream, logPath
    If isError Then
        logPath = ERROR_LOG_FILE
    Else
        logPath = LOG_FILE
    End If

    CreateLogDirectory logPath

    On Error Resume Next
    Set logStream = fso.OpenTextFile(logPath, 8, True)
    logStream.WriteLine Now & " - " & message
    logStream.Close
    On Error GoTo 0

    ' 控制台输出(调试用)
    WScript.Echo Now & " - " & message
End Sub

' ============ 核心功能 ============
' 检查进程是否存在
Function IsProcessRunning(processName)
    Dim processes, process
    On Error Resume Next

    Set processes = wmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & processName & "'")

    ' 详细检查
    For Each process In processes
        If UCase(process.Name) = UCase(processName) Then
            IsProcessRunning = True
            Exit Function
        End If
    Next

    IsProcessRunning = False
    On Error GoTo 0
End Function

' 启动应用程序
Function StartApplication(app)
    Dim result, cmd, workingDir
    On Error Resume Next

    WriteLog "尝试启动: " & app("Name"), False

    ' 检查文件是否存在
    If Not fso.FileExists(app("Path")) Then
        WriteLog "错误: 应用程序不存在 - " & app("Path"), True
        Exit Function
    End If

    ' 设置工作目录
    workingDir = fso.GetParentFolderName(app("Path"))

    ' 构建启动命令
    cmd = Chr(34) & app("Path") & Chr(34) ' 用引号包裹路径

    ' 启动应用程序
    result = shell.Run(cmd, 1, False, workingDir)

    If Err.Number = 0 Then
        WriteLog "成功启动: " & app("Name"), False
        StartApplication = True
        app("StartTime") = Now
        app("IsRunning") = True
    Else
        WriteLog "启动失败: " & app("Name") & " - 错误: " & Err.Description, True
        StartApplication = False
    End If

    On Error GoTo 0
End Function

' 强制结束进程
Sub KillProcess(processName)
    Dim processes, process
    On Error Resume Next

    Set processes = wmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & processName & "'")

    For Each process In processes
        process.Terminate()
        If Err.Number = 0 Then
            WriteLog "已终止进程: " & processName, False
        End If
    Next

    On Error GoTo 0
End Sub

' ============ 主监控循环 ============
Sub MonitorApps()
    Dim i, app, isAnyRunning

    WriteLog "应用程序监控服务启动", False
    WriteLog "监控间隔: " & (CHECK_INTERVAL/1000) & "秒", False

    Do
        isAnyRunning = False

        ' 检查每个应用
        For i = 0 To UBound(apps)
            Set app = apps(i)

            If IsProcessRunning(app("Name")) Then
                If Not app("IsRunning") Then
                    WriteLog "检测到运行: " & app("Name"), False
                    app("IsRunning") = True
                End If
                isAnyRunning = True
            Else
                If app("IsRunning") Then
                    WriteLog "检测到停止: " & app("Name"), False
                    app("IsRunning") = False
                End If

                ' 尝试重启
                If restartCount < MAX_RESTART_ATTEMPTS Then
                    If StartApplication(app) Then
                        restartCount = 0
                    Else
                        restartCount = restartCount + 1
                        WriteLog "重启尝试次数: " & restartCount & "/" & MAX_RESTART_ATTEMPTS, True
                    End If
                Else
                    WriteLog "达到最大重启次数,停止尝试: " & app("Name"), True
                End If
            End If
        Next

        ' 等待下一次检查
        WScript.Sleep CHECK_INTERVAL

    Loop
End Sub

' ============ 启动脚本 ============
' 检查是否以管理员权限运行(可选)
If Not IsElevated() Then
    WriteLog "警告: 建议以管理员权限运行此脚本", True
End If

' 创建日志目录
CreateLogDirectory LOG_FILE
CreateLogDirectory ERROR_LOG_FILE

' 开始监控
On Error Resume Next
MonitorApps

If Err.Number <> 0 Then
    WriteLog "监控服务异常停止: " & Err.Description, True
    WScript.Quit 1
End If

创建Windows计划任务(自动启动监控)

创建一个批处理文件 SetupMonitor.bat

@echo off
echo 创建应用程序监控任务...

:: 创建计划任务(每5分钟运行一次)
schtasks /create /tn "Application Monitor" /tr "wscript.exe C:\Scripts\AppMonitor.vbs" /sc minute /mo 5 /ru SYSTEM /rl HIGHEST /f

:: 立即启动一次
schtasks /run /tn "Application Monitor"

echo 监控任务已创建!
pause

停止监控脚本

创建一个停止脚本 StopMonitor.vbs

Option Explicit

' 停止所有监控进程
Dim wmiService, processes, process
Set wmiService = GetObject("winmgmts:\\.\root\cimv2")
Set processes = wmiService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='wscript.exe'")

For Each process In processes
    If InStr(process.CommandLine, "AppMonitor.vbs") > 0 Then
        process.Terminate()
        WScript.Echo "已停止监控进程: PID " & process.ProcessId
    End If
Next

' 删除计划任务
Dim shell
Set shell = CreateObject("WScript.Shell")
shell.Run "schtasks /delete /tn ""Application Monitor"" /f", 0, True

WScript.Echo "监控已停止"

使用方法:

保存脚本:将基础脚本保存为 AppMonitor.vbs

修改配置

  • 修改 APP_NAME 为要监控的进程名(如:myapp.exe
  • 修改 APP_PATH 为应用程序的完整路径
  • 调整 CHECK_INTERVAL 检查间隔(毫秒)

运行方式

  • 手动运行:双击 AppMonitor.vbs
  • 作为服务:使用计划任务(推荐)
  • 开机启动:将脚本添加到启动文件夹

注意事项:

权限:某些应用程序需要管理员权限才能启动 进程名:确保使用正确的进程名(不带路径) 日志:定期清理日志文件 测试:先在测试环境验证脚本功能

这个脚本会持续监控指定的应用程序,如果发现进程不存在,会自动重新启动它,并记录所有操作到日志文件中。

相关推荐
节假日高速免费期间,如何利用导航软件实时规避拥堵路段和事故点?
节假日高速免费期间,如何利用导航软件实时规避拥堵路段和事故点?
XML重复查询一条Sql语句的解决方法
XML重复查询一条Sql语句的解决方法
2026年流行文化解析:开盲盒模式如何融入日常生活与消费场景
2026年流行文化解析:开盲盒模式如何融入日常生活与消费场景
夏日本色:为何午后雷阵雨总“准时打卡”?拆解夏季大气环流小秘密
夏日本色:为何午后雷阵雨总“准时打卡”?拆解夏季大气环流小秘密
睫角守宫的繁殖过程有什么特点?揭秘这种爬行动物的生命延续方式
睫角守宫的繁殖过程有什么特点?揭秘这种爬行动物的生命延续方式
在提交人才引进补贴申请材料时,需要特别注意哪些材料的规范性与有效性?
在提交人才引进补贴申请材料时,需要特别注意哪些材料的规范性与有效性?
法拍房“满5年可转让”这一条件,具体是从哪个时间点开始计算?
法拍房“满5年可转让”这一条件,具体是从哪个时间点开始计算?
如何监督外包企业切实执行垃圾分类与绿化废弃物资源化处理的要求?
如何监督外包企业切实执行垃圾分类与绿化废弃物资源化处理的要求?
未来的“预约配送”服务能否更加精准灵活,以满足上门需求?
未来的“预约配送”服务能否更加精准灵活,以满足上门需求?
在年末大扫除时,高效完成全厨房深度去油污的流程是怎样的?
在年末大扫除时,高效完成全厨房深度去油污的流程是怎样的?
2026年流行的电子消费券,主要覆盖了哪些日常生活消费场景和商品品类?
2026年流行的电子消费券,主要覆盖了哪些日常生活消费场景和商品品类?
2026年,办理不动产权证加名,从申请到拿到新证大概需要多长时间?
2026年,办理不动产权证加名,从申请到拿到新证大概需要多长时间?
对于积分将到期的持证人,在2026年办理积分续签的具体流程和材料有何更新?
对于积分将到期的持证人,在2026年办理积分续签的具体流程和材料有何更新?
社区宠物公约能否有效解决不文明养犬引发的邻里矛盾和安全隐患?
社区宠物公约能否有效解决不文明养犬引发的邻里矛盾和安全隐患?
在申请职工大额费用补助的整个过程中,需要特别注意哪些关键环节?
在申请职工大额费用补助的整个过程中,需要特别注意哪些关键环节?
作为消费者,当权益受到侵害时,如何正确寻求法律援助并准备材料?
作为消费者,当权益受到侵害时,如何正确寻求法律援助并准备材料?
当通讯中断无法联系外界时,有哪些有效的求救信号和方法可以尝试使用?
当通讯中断无法联系外界时,有哪些有效的求救信号和方法可以尝试使用?
从个人叙事出发,“全抛”选择背后有哪些不为人知的故事与复杂考量?
从个人叙事出发,“全抛”选择背后有哪些不为人知的故事与复杂考量?
不同城市的120急救收费标准与医保报销比例是否存在差异?
不同城市的120急救收费标准与医保报销比例是否存在差异?