遍历服务器并输出结果和错误
Loop through servers and output results along with errors
我编写了一个简单的 PowerShell 脚本来检索服务器上次启动时间的列表并将结果输出到网格视图。结果会立即显示在网格 window 中,但每当服务器未响应 get 命令时会出现短暂的暂停,这可能是由于 WMI 未 运行 或 class 未注册。然后它在 PS 中显示错误并移动到下一个服务器。
现在,除非 "not responding" 个服务器显示在结果 windows 中,否则结果没有帮助。
$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 window 中显示的红色错误类型:
- Get-WmiObject:Class 未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))在 line:1 char:12
- Get-WmiObject:RPC 服务器不可用。 (HRESULT 异常:0x800706BA)在 line:1 char:12
编辑:如果服务器响应错误,我该如何输出好的结果和服务器名称?
为了您想要的结果,您需要单独查询服务器并在查询失败时构造一个自定义对象:
$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(或类似的东西)而不是简单的循环来通过运行并行而不是顺序地加速检查。在后台将每个检查作为一个作业生成,并循环检查已完成的作业,直到所有作业都完成。收集已完成作业的输出。
这是循环遍历服务器、捕获 non-terminating 错误并输出到 window.
的完整脚本
$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
我编写了一个简单的 PowerShell 脚本来检索服务器上次启动时间的列表并将结果输出到网格视图。结果会立即显示在网格 window 中,但每当服务器未响应 get 命令时会出现短暂的暂停,这可能是由于 WMI 未 运行 或 class 未注册。然后它在 PS 中显示错误并移动到下一个服务器。
现在,除非 "not responding" 个服务器显示在结果 windows 中,否则结果没有帮助。
$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 window 中显示的红色错误类型:
- Get-WmiObject:Class 未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))在 line:1 char:12
- Get-WmiObject:RPC 服务器不可用。 (HRESULT 异常:0x800706BA)在 line:1 char:12
编辑:如果服务器响应错误,我该如何输出好的结果和服务器名称?
为了您想要的结果,您需要单独查询服务器并在查询失败时构造一个自定义对象:
$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(或类似的东西)而不是简单的循环来通过运行并行而不是顺序地加速检查。在后台将每个检查作为一个作业生成,并循环检查已完成的作业,直到所有作业都完成。收集已完成作业的输出。
这是循环遍历服务器、捕获 non-terminating 错误并输出到 window.
的完整脚本$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