需以管理员身份运行PowerShell并执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,再创建check-services.ps1脚本检测w3svc、MSSQLSERVER等服务状态,支持Invoke-WebRequest验证HTTP服务及Test-NetConnection探测端口,并通过任务计划程序定时自动执行。

在Windows环境中需要定期确认关键服务器(如SQL Server、IIS、自定义HTTP服务)是否仍在运行,避免人工巡检遗漏导致业务中断。
使用PowerShell编写基础服务存活检测脚本
第一步:以管理员身份打开PowerShell,执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,否则脚本将被系统阻止运行。【不执行此步会导致后续脚本双击无反应或报错“无法加载文件”】
第二步:新建文本文件,重命名为check-services.ps1,用记事本或VS Code打开,粘贴以下内容:
$services = @("w3svc", "MSSQLSERVER", "Spooler")
foreach ($svc in $services) {
if ((Get-Service $svc -ErrorAction SilentlyContinue).Status -ne "Running") {
Write-Host "$svc 服务未运行" -ForegroundColor Red
# 可在此添加重启逻辑:Start-Service $svc
} else {
Write-Host "$svc 服务正常" -ForegroundColor Green
}
}
第三步:保存后,在PowerShell中直接运行.\check-services.ps1即可看到各服务状态输出。注意路径必须与脚本所在目录一致,否则需写完整路径。
检测远程HTTP服务是否响应
方法一:用Invoke-WebRequest验证Web端口连通性
在脚本中追加以下代码段(替换原脚本末尾):
$urls = @("http://192.168.1.10:8080/health", "https://api.example.com/status")
foreach ($url in $urls) {
try {
$res = Invoke-WebRequest -Uri $url -TimeoutSec 5 -UseBasicParsing
if ($res.StatusCode -eq 200) { Write-Host "$url 响应正常" -F Green }
else { Write-Host "$url 返回非200状态:$res.StatusCode" -F Yellow }
} catch { Write-Host "$url 访问失败:$($_.Exception.Message)" -F Red }
}
方法二:用Test-NetConnection快速探测端口(无需HTTP响应体)
对数据库或Redis等非HTTP服务更适用:
if (-not (Test-NetConnection -ComputerName 192.168.1.20 -Port 1433 -WarningAction SilentlyContinue).TcpTestSucceeded) {
Write-Host "SQL Server端口1433不可达" -F Red
}
设置定时自动运行
第一步:将脚本保存为D:\scripts\check-services.ps1(路径中不能含中文或空格)
第二步:新建任务计划程序→创建基本任务→命名“每日服务巡检”→触发器设为“每天”+具体时间→操作选“启动程序”→程序填powershell.exe→参数填-ExecutionPolicy Bypass -File "D:\scripts\check-services.ps1"
第三步:在“常规”选项卡中勾选“使用最高权限运行”,并选择“只在用户登录时运行”或“不存储密码则只在本地系统账户下运行”。【若不勾选最高权限,Get-Service可能因权限不足返回空结果】
第四步:点击“完成”,立即右键该任务→“运行”测试是否弹出PowerShell窗口并输出结果。


















