top
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮件:766378891@qq.com

Windows 软件保活 PowerShell 脚本


共计 3573 个字符,预计需要花费 9 分钟才能阅读完成。

由于使用了 RunAny 这款启动神器,很多免安装的软件启动都是通过这款软件启动的,但不知道为什么经常会退出,于是让 gpt 写一个 powershell 脚本,每隔 10 秒检查一次,如果软件没有运行,就启动软件。

编写好如下脚本,然后设置 Windows 定时任务即可(需要配置为只在用户登录时运行),当然可以修改脚本监控其他软件。

Windows 软件保活 PowerShell 脚本

/>

# 获取脚本所在的目录
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition

# ARunAny-5.8.2 目录路径
$runAnyDir = Join-Path -Path $scriptDir -ChildPath "ARunAny-5.8.2"

# 要监控的进程名称
$processName = "RunAny.exe"

# 可执行文件的完整路径(位于 ARunAny-5.8.2 目录中)
$exePath = Join-Path -Path $runAnyDir -ChildPath "RunAny.exe"

# 日志文件路径(存储在临时目录中)
# C:\Users\hause\AppData\Local\Temp\runany_log.txt
$logFilePath = "$env:TEMP\log\runany_log.txt"
# 获取日志文件所在目录
$logDir = [System.IO.Path]::GetDirectoryName($logFilePath)
# 判断目录是否存在,如果不存在则创建
if (-not (Test-Path -Path $logDir)) {
    New-Item -Path $logDir -ItemType Directory -Force
} 

# 写入日志的函数
function Write-Log {
    param(
        [string]$message
    )
    $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
    $logMessage = "$timestamp - $message"

    # 以 UTF-8 编码将日志消息写入日志文件
    $logMessage | Out-File -FilePath $logFilePath -Encoding utf8 -Append
    Write-Host $logMessage
}

# 初始化日志
Write-Log "Script started..."

# 循环检查进程是否正在运行
while ($true) {
    # 获取所有正在运行的进程
    $process = Get-Process -ErrorAction SilentlyContinue | Where-Object { $_.ProcessName -eq [System.IO.Path]::GetFileNameWithoutExtension($processName) }

    # 如果进程没有运行
    if (-not $process) {
        # Start the process
        Write-Log "$processName 没有启动, 重启中..."
        Start-Process $exePath
        Write-Log "$processName 已启动."

        # 请求webhook
        $message = "Runany重启成功"
        New-BurntToastNotification -Text "Runany监控", $message
    } else {
        Write-Log "$processName 正在运行."
    }

    # 每隔 30 秒检查一次
    Start-Sleep -Seconds 30
}

如果有多个需要保活的软件:

# 获取脚本所在的目录 
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition

# 进程的目录和名称配置
# Dir 可以是当前脚本的相对目录,或者直接绝对目录
$processConfigs = @(
    @{ Dir = "ARunAny-5.8.2"; Name = "RunAny.exe"; MinInstances = 4; Arguments = "" },
    @{ Dir = "MouseInc";  Name = "MouseInc.exe"; MinInstances = 1; Arguments = "" },
    @{ Dir = "Umi-OCR-v1.3.5"; Name = "Umi-OCR.exe"; MinInstances = 1; Arguments = "" },
    @{ Dir = "syncthing-windows-amd64-v1.29.3"; Name = "syncthing.exe"; MinInstances = 1; Arguments = "-no-console -no-browser" }
)

# 日志文件路径(存储在临时目录中)
$logFilePath = "$env:TEMP\log\keepalive_log.txt"
# 获取日志文件所在目录
$logDir = [System.IO.Path]::GetDirectoryName($logFilePath)
# 判断目录是否存在,如果不存在则创建
if (-not (Test-Path -Path $logDir)) {
    New-Item -Path $logDir -ItemType Directory -Force
} 

# 写入日志的函数
function Write-Log {
    param(
        [string]$message
    )
    $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
    $logMessage = "$timestamp - $message"

    # 以 UTF-8 编码将日志消息写入日志文件
    $logMessage | Out-File -FilePath $logFilePath -Encoding utf8 -Append
    Write-Host $logMessage
}

# 初始化日志
Write-Log "脚本启动..."

# 用于存储需要通知的消息
$notificationMessages = @()

# 循环检查进程是否正在运行
while ($true) {
    foreach ($config in $processConfigs) {
        $processName = $config.Name
        $processDir = $config.Dir
        $minInstances = $config.MinInstances
        $arguments = $config.Arguments

        # 可执行文件的完整路径
        # 判断 processDir 是否为绝对路径
        if (-not (Test-Path $processDir)) {
            $exePath = Join-Path -Path $scriptDir -ChildPath $processDir
        } else {
            $exePath = $processDir
        }
        $exePath = Join-Path -Path $exePath -ChildPath $processName

        # 获取所有正在运行的进程
        $processes = Get-Process -ErrorAction SilentlyContinue | Where-Object { $_.ProcessName -eq [System.IO.Path]::GetFileNameWithoutExtension($processName) }
        Write-Log "$processName 运行实例数:$($processes.Count)"

        # 如果进程没有运行
        if ($processes.Count -lt $minInstances) {
            # 启动进程
            Write-Log "$processName 实例数少于要求 $minInstances, 正在重启..."
            Start-Process $exePath -ArgumentList $arguments
            Write-Log "$processName 已启动."

            # 添加到通知消息列表
            $notificationMessages += "$processName 启动成功"
        } else {
            Write-Log "$processName 正在运行."
        }
    }

    # 如果有需要发送的通知
    if ($notificationMessages.Count -gt 0) {
        # 合并通知消息
        $combinedMessage = [string]::Join("`n", $notificationMessages)

        # 发送通知
        Write-Log "准备发送通知: $combinedMessage"
        try {
            New-BurntToastNotification -Text "软件保活", $combinedMessage
            Write-Log "通知发送成功."
        } catch {
            Write-Log "通知发送失败: $_"
        }

        # 清空通知消息列表
        $notificationMessages = @()
    } else {
        Write-Log "没有新的通知消息."
    }

    # 每隔 10 秒检查一次
    Start-Sleep -Seconds 20
}

Tips:清朝云网络工作室

阅读剩余
THE END
icon
0
icon
分享
icon
二维码
icon
海报
发表评论
评论列表

赶快来坐沙发

中午好👋, 记得好好吃午饭哦