如何优化跨Windows Server版本检测IIS/FTP/SMTP服务状态的PowerShell脚本
PowerShell脚本优化方案
原脚本存在的问题
- 硬编码8个分支判断3个服务的状态,可扩展性极差,新增服务需要翻倍增加判断分支
- 重复调用
Get-WmiObject获取系统信息,产生不必要的系统开销 Get-WmiObject已在PowerShell 3.0及以上版本被弃用,高版本系统执行会抛出废弃警告- 输出仅为纯文本,无法直接对接批量巡检的结果导出(如CSV、Excel)需求
- 兼容适配性不足,部分低版本系统服务名存在微小差异时会误判
优化后脚本
# 定义需要检查的服务映射:服务名 = 显示名称 $checkServices = @{ "w3svc" = "IIS" "ftpsvc" = "FTP" "smtpsvc" = "SMTP" } # 只查询一次操作系统信息 $osInfo = (Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue).Caption if (-not $osInfo) { # 兼容未安装Cim组件的老系统,降级到WMI查询 $osInfo = (Get-WmiObject -Class Win32_OperatingSystem).Caption } # 初始化结果对象 $result = [PSCustomObject]@{ 操作系统 = $osInfo 服务状态 = @() } # 循环检查每个服务 foreach ($svc in $checkServices.GetEnumerator()) { $serviceObj = Get-Service -Name $svc.Key -ErrorAction SilentlyContinue $status = if ($serviceObj) { "已安装,状态:$($serviceObj.Status)" } else { "未安装" } $result.服务状态 += "$($svc.Value):$status" } # 输出可读文本 Write-Host ($result.服务状态 -join ",") "操作系统:$($result.操作系统)" # 批量巡检时可去掉下方注释直接导出结果到CSV # $result | Select-Object 操作系统, @{n="服务状态";e={$_.服务状态 -join ";"}} | Export-Csv -Path "服务巡检结果.csv" -NoTypeInformation -Encoding UTF8
优化说明
- 采用配置式定义要检查的服务,后续新增服务只需要在
$checkServices哈希表中新增键值对即可,不需要修改逻辑代码 - 统一只查询1次操作系统信息,减少系统资源占用
- 兼容所有Windows Server 2008~2019版本,高版本系统用CimInstance避免废弃警告,低版本系统自动降级到WMI查询
- 输出结构化对象,既可以直接打印可读文本,也可以直接导出为CSV等格式满足批量巡检需求
- 总代码量减少70%,逻辑更清晰,出错概率大幅降低
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

