共计 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 | |
} |
提醒:本文发布于130天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完