powershell脚本可监控并自动重启windows服务,需以管理员身份运行,通过循环检测服务状态、启动失败重试、日志记录及计划任务实现长期稳定运行。
在 windows 中,powershell 脚本可以定期检查指定服务的状态,一旦发现服务已停止,就立即尝试启动它。关键在于合理轮询、避免频繁操作、处理权限与服务依赖,并确保脚本能稳定长期运行。
编写基础检测与重启脚本
以下是一个简洁可靠的脚本示例,用于监控名为 Spooler 的打印服务(可替换成任意服务名):
注意:需以管理员身份运行 PowerShell 才能启动/停止服务
- 新建一个文本文件,保存为 Watch-Service.ps1
- 内容如下:
$serviceName = "Spooler" # 替换为你想监控的服务名(可用 Get-Service | Select Name 查看)
$checkIntervalSeconds = 10
<p>while ($true) {
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if (-not $service) {
Write-Warning "服务 '$serviceName' 不存在"
break
}
if ($service.Status -ne 'Running') {
Write-Host "$(Get-Date): 服务 '$serviceName' 已停止,正在尝试启动..." -ForegroundColor Yellow
try {
Start-Service -Name $serviceName -ErrorAction Stop
Write-Host "$(Get-Date): 服务 '$serviceName' 已成功启动" -ForegroundColor Green
}
catch {
Write-Error "$(Get-Date): 启动失败 — $($_.Exception.Message)"
}
}
Start-Sleep -Seconds $checkIntervalSeconds
}</p>
设置脚本自动后台运行
PowerShell 控制台关闭后脚本会终止,需借助计划任务或 Windows 服务方式让它持续运行:
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
-
推荐方式:用 Windows 计划任务 + 启动脚本
创建一个触发器为“登录时”或“按需手动启动”的基本任务,操作设为:powershell.exe -ExecutionPolicy Bypass -File "C:\path\to\Watch-Service.ps1" - 勾选“不管用户是否登录都要运行”和“使用最高权限”,避免因权限缺失导致启动失败
- 如需开机即运行,可将触发器设为“系统启动时”,但注意此时部分服务可能尚未初始化,建议加 30 秒延迟再开始检测
增强健壮性的小技巧
真实环境中,服务可能因依赖项缺失、配置错误或资源冲突反复崩溃,单纯重启不够:
- 加入启动失败重试机制(例如最多重试 3 次,每次间隔 5 秒)
- 记录日志到文件:
"$(Get-Date): $($service.Status)" | Out-File C:\Logs\ServiceWatch.log -Append - 检查服务启动类型是否为“自动”:
if ($service.StartType -ne 'Automatic') { Set-Service -Name $serviceName -StartupType Automatic },防止被误改 - 若服务频繁停止,建议配合
Get-EventLog -LogName System -Source Service Control Manager -After (Get-Date).AddHours(-1)查看系统级报错
验证与调试要点
首次部署前务必测试,避免误操作影响生产环境:
- 先手动运行脚本,观察控制台输出是否符合预期
- 临时停止目标服务(如
Stop-Service Spooler),确认脚本能捕获并恢复 - 检查执行策略:
Get-ExecutionPolicy,若为 Restricted,需先运行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 脚本路径中避免空格或中文;若必须含空格,请在命令中用引号包裹完整路径










