共计 3573 个字符,预计需要花费 9 分钟才能阅读完成。
由于使用了 RunAny 这款启动神器,很多免安装的软件启动都是通过这款软件启动的,但不知道为什么经常会退出,于是让 gpt 写一个 powershell 脚本,每隔 10 秒检查一次,如果软件没有运行,就启动软件。
编写好如下脚本,然后设置 Windows 定时任务即可(需要配置为只在用户登录时运行),当然可以修改脚本监控其他软件。
# 获取脚本所在的目录
$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
}
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完