如何在PowerShell脚本中传递服务器参数以获取服务器运行时间?
问题分析
原脚本存在两个核心错误:
- 混淆了服务名称与服务器名称:
Win32_Service的Name字段是Windows服务的内部标识(如TermService),而非目标服务器的名称,传入服务器名OURSERVER必然无法获取到有效服务实例。 - 获取服务器运行时间的路径错误:通过服务关联进程计算的是单个服务进程的运行时长,并非服务器系统的整体运行时间。
正确实现方案
要获取本地或远程服务器的系统运行时间,直接查询Win32_OperatingSystem类即可,该类的LastBootUpTime属性记录了系统上次启动时间,用当前时间减去该值就能得到准确的运行时长。
修正后的脚本
function Get-ServerUptime { param ( # 指定目标服务器名称,留空默认查询本地服务器 [string]$ComputerName = $env:COMPUTERNAME ) try { # 获取操作系统启动信息 $osInfo = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $ComputerName -ErrorAction Stop # 计算运行时长 $uptime = (Get-Date) - $osInfo.LastBootUpTime # 返回结构化结果 return [PSCustomObject]@{ ServerName = $ComputerName Uptime = $uptime LastBoot = $osInfo.LastBootUpTime } } catch { Write-Error "无法连接到服务器 $ComputerName : $_" return $null } } # 使用示例:查询远程服务器OURSERVER的运行时间 $serverUptime = Get-ServerUptime -ComputerName "OURSERVER" if ($serverUptime) { Write-Host "`n服务器 $($serverUptime.ServerName) 运行信息:" Write-Host "上次启动时间:$($serverUptime.LastBoot)" Write-Host "已运行时长:$($serverUptime.Uptime.Days)天 $($serverUptime.Uptime.Hours)小时 $($serverUptime.Uptime.Minutes)分钟" }
关键说明
- 服务器参数传递:直接传入服务器名
OURSERVER即可,无需添加反斜杠;如果查询本地服务器,可省略-ComputerName参数。 - 权限要求:运行脚本的用户需拥有目标服务器的WMI/CIM访问权限,通常以管理员身份启动PowerShell即可满足。
- 异常处理:脚本加入了
try/catch块,可捕获连接失败、权限不足等异常,便于排查问题。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

