多服务器停机时间脚本仅执行本地,请求技术协助
多服务器停机时间统计脚本修复方案
你的现有代码存在两个核心问题:
ForEach循环体为空(大括号{}内无执行逻辑),等于没对目标服务器做任何操作- 未指定远程执行上下文,
$TotalDownTime默认只会读取本地主机的信息
修复后的脚本示例
使用CIM(推荐替代WMI的远程管理方式)获取多服务器停机/运行时长,代码如下:
$ServerList = 'srv01','srv02' $Results = @() ForEach ($Server in $ServerList) { try { # 远程获取目标服务器的系统运行信息 $osData = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $Server -ErrorAction Stop $uptime = (Get-Date) - $osData.LastBootUpTime # 整理统计数据 $stat = [PSCustomObject]@{ ServerName = $Server LastBootTime = $osData.LastBootUpTime UptimeDays = [math]::Round($uptime.TotalDays, 2) UptimeHours = [math]::Round($uptime.TotalHours, 2) } $Results += $stat } catch { # 捕获连接失败的异常,记录错误信息 $errorStat = [PSCustomObject]@{ ServerName = $Server ErrorMessage = "连接失败:$($_.Exception.Message)" } $Results += $errorStat } } # 输出所有服务器的统计结果 $Results | Format-Table -AutoSize
关键说明
Get-CimInstance -ComputerName $Server是让脚本作用于远程服务器的核心,明确指定了目标主机- 加入
try/catch块处理远程连接失败的情况,避免脚本中断 - 将结果统一存入数组后输出,便于批量查看所有服务器状态
前置要求
- 执行脚本的账号需拥有目标服务器的管理员权限
- 目标服务器已开启
WinRM服务(PowerShell远程管理的基础服务) - 网络允许目标服务器的5985(HTTP)或5986(HTTPS)端口通信
内容的提问来源于stack exchange,提问作者Dhonovan
相关产品推荐
相关产品推荐

