我写了一个简单的PowerShell脚本来检索服务器列表'上次启动时间并将结果输出到网格视图。结果立即显示在网格窗口中,但是当服务器没有响应get命令时,由于WMI未运行或类未注册,因此会暂停。然后它会在PS中显示错误并移至下一个服务器。
现在,除非"没有回应"否则结果没有用。服务器显示在结果窗口中。
$servers = ('serverx','serverb')
Get-WmiObject -Class Win32_OperatingSystem -ComputerName $servers |
select csname, @{LABEL='LastBootUpTime';EXPRESSION={$_.ConvertToDateTime($_.LastBootupTime)}},
@{LABEL='LocalTime';EXPRESSION={$_.ConvertToDateTime($_.LocalDateTime)}},
@{LABEL='UpTime';EXPRESSION={(Get-Date) - $_.ConvertToDateTime($_.LastBootupTime)}},
@{LABEL='OS';EXPRESSION={$_.Caption}} |
Out-GridView
PS窗口中显示的错误类型为红色:
编辑:如果响应错误的服务器,如何输出良好的结果和服务器名称?
答案 0 :(得分:0)
对于您想要的结果,您需要单独查询服务器并在查询失败时构造自定义对象:
$svr = 'serverx'
try {
Get-WmiObject Win32_OperatingSystem -Computer $svr -EA Stop |
select csname, @{n='LocalTime';e={...}},
@{n='UpTime';e={...}}, @{n='OS';e={...}}
} catch {
New-Object -Type PSObject -Property @{
csname = $svr
LocalTime = $null
UpTime = $null
OS = $null
}
}
循环运行
$servers | ForEach-Object {
...
} | Out-GridView
使用background jobs(或类似的东西)代替普通循环来加速检查,方法是并行运行它们。将每个支票在后台生成作业,并在循环中检查已完成的作业,直到所有作业完成。收集已完成作业的输出。
答案 1 :(得分:0)
这是遍历服务器的完整脚本,捕获非终止错误并输出到窗口。
$svr = ('localhost','fail')
$Output = Foreach ($server in $svr)
{
try {
Get-WmiObject Win32_OperatingSystem -ComputerName $server -EA STOP |
select csname, @{n='LocalTime';e={$_.ConverttoDateTime($_.lastbootuptime)}},
@{n='UpTime';e={....}}, @{n='OS';e={"...."}}
} catch {
New-Object -Type PSObject -Property @{
Csname = $server
LocalTime = $null
UpTime = $null
OS = "Error" #$null
}
}
}
$output | Out-GridView