PowerShell脚本问题:如何将无响应服务器纳入开机时间查询结果
解决PowerShell脚本无法显示无响应服务器的问题
我明白你的痛点——现在脚本只展示能正常查询的服务器,那些因为WMI问题或者网络不通的服务器只在控制台报错,完全没出现在结果视图里,这确实让结果的实用性大打折扣。咱们可以通过添加错误捕获与处理逻辑,把这些失败的服务器信息也统一收集起来,一起展示在网格视图里。
下面是修改后的完整脚本:
# 定义服务器列表 $servers = ('serverx', 'servery', 'serverz') # 替换成你的服务器列表 # 初始化空数组,用于存储所有结果(成功+失败) $results = @() foreach ($server in $servers) { try { # 强制将错误转为终止错误,以便被catch捕获 $osInfo = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $server -ErrorAction Stop -OperationTimeoutSec 5 # 计算上次开机时间(转换为易读格式) $lastBootTime = $osInfo.LastBootUpTime $uptime = (Get-Date) - $lastBootTime # 创建成功结果对象 $resultObj = [PSCustomObject]@{ ServerName = $server LastBootUpTime = $lastBootTime.ToString('yyyy-MM-dd HH:mm:ss') Uptime = "$($uptime.Days)天 $($uptime.Hours)小时 $($uptime.Minutes)分钟" Status = "成功" ErrorMessage = $null } } catch { # 创建失败结果对象,捕获错误信息 $resultObj = [PSCustomObject]@{ ServerName = $server LastBootUpTime = $null Uptime = $null Status = "失败" ErrorMessage = $_.Exception.Message } } # 将结果加入数组 $results += $resultObj } # 将所有结果输出到网格视图 $results | Out-GridView -Title "服务器开机时间查询结果"
关键修改点说明:
- 错误捕获逻辑:使用
try/catch块包裹查询代码,并且添加-ErrorAction Stop参数——默认情况下Get-CimInstance的错误是非终止错误,不会触发catch,这个参数能把错误转为终止错误,让我们可以捕获并处理。 - 统一结果收集:不管查询成功还是失败,都创建一个包含相同字段的自定义对象,这样网格视图里的列是统一的,便于查看对比。
- 超时优化:添加
-OperationTimeoutSec 5参数,把每个服务器的查询超时时间设为5秒,避免无响应时脚本长时间停顿。 - 状态与错误标注:新增
Status和ErrorMessage字段,明确标记服务器的查询状态,失败时还能看到具体的错误原因(比如WMI未运行、无法连接等)。
这样修改后,所有服务器的状态都会清晰地展示在网格视图里,你一眼就能看到哪些服务器正常,哪些出了问题,还能知道具体原因,实用性大幅提升!
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

