You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化跨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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:09:04