-1

我编写了一个简单的 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 窗口中以红色显示的错误类型:

  1. Get-WmiObject:类未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))在行:1 字符:12
  2. Get-WmiObject : RPC 服务器不可用。(来自 HRESULT 的异常:0x800706BA)在 line:1 char:12

编辑:如果服务器响应错误,我如何输出良好的结果以及服务器名称?

4

2 回答 2

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

使用后台作业(或类似的东西)而不是简单的循环来通过并行而不是顺序运行它们来加速检查。在后台生成每个检查作为作业,并在循环中检查已完成的作业,直到所有作业都完成。从已完成的作业中收集输出。

于 2018-03-21T20:16:52.180 回答
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
于 2018-03-22T15:59:17.933 回答