RunSpacePool重启计算机没有记录成功



我正在编写一个脚本,该脚本将在稍后的时间使用下面的脚本在任务调度程序中重新启动服务器列表。

脚本使用RunSpacePools来处理多个服务器,但似乎发生的是我的脚本未能记录成功的重启。

我检查了使用此脚本重新启动的服务器,并发现USER32的事件ID 1074记录了关机/重启事件,但我创建的记录保存日志说Reboot失败

我只是不确定如何开始排除这个问题。感谢任何帮助!

param([Parameter(Mandatory=$true)][string]$InputServerList)
#Script block for runspaces
$ScriptBlock = {
 Param([Parameter(Mandatory=$true)][string]$server)
 $ErrorActionPreference = "SilentlyContinue"
    Try{
$LastReboot = Get-EventLog -ComputerName $server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1
Restart-Computer -ComputerName $server -Force
#New loop with counter, exit script if server did not reboot.
$max = 60;$i = 0
 DO{
    IF($i -gt $max){
        [PsCustomObject]@{
             "Server" =  $server
             "Status" = "FailedToReboot!"
             "LastRebootTime" = "$LastReboot"
             "CurrentRebootTime" = "FailedToReboot!"
          }#end custom object
            $subject="Warning: $server Did not Reboot!  Please Check!"
            #$SendTo = <Email List>
$body = @"
 LastRebootTime = $LastReboot
 Script waited 10 minutes for $server to reboot.
 "@
#Send-MailMessage <details>
    exit}#exit script and log failed to reboot.
    $i++
    Start-Sleep -Seconds 10
}#end DO
#At this point, server went offline.  Script waits 10 minutes for server to come online.
While (Test-path "\$serverc$")
$max = 60;$i = 0
 DO{
 IF($i -gt $max){
        [PsCustomObject]@{
             "Server" =  $server
             "Status" = "FailedToComeOnline!"
             "LastRebootTime" = "$LastReboot"
             "CurrentRebootTime" = "FailedToReboot!"
          }
$body = @"
 LastRebootTime = $LastReboot
 Script waited 10 minutes for $server to come back online, please investigate.
 "@
$subject="Warning!!!!: $server Did not Come Online!  Please Check!"
#Send-MailMessage <details>
    exit}#exit script and log failed to come online.
    $i++
    Start-Sleep -Seconds 10
}#end DO
While (-not(Test-path "\$serverc$"))
$CurrentReboot = Get-EventLog -ComputerName $server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1
    [PsCustomObject]@{
             "Server" =  $server
             "Status" = "RebootSuccessful"
             "LastRebootTime" = $LastReboot
             "CurrentRebootTime" = "$CurrentReboot"
              }
}#End Try.
Catch{
 $errMsg = $_.Exception.Message.ToString().Trim()
 #"$server : Failed with $errMsg"
        [PsCustomObject]@{
             "Server" =  $server
             "Status" = "FailedToReboot!"
             "LastRebootTime" = "$errMsg"
             "CurrentRebootTime" = "FailedToReboot!"
          }#end custom object
 }
}#end script block
#Define computers to work with.
$Computers = Get-Content $InputServerList

#Create Runspace pool
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(30,30)
$RunspacePool.Open()
$Jobs = 
 foreach ( $Computer in $Computers )
  {
 $Job = [powershell]::Create().
        AddScript($ScriptBlock).
        AddArgument($Computer)
 $Job.RunspacePool = $RunspacePool
 [PSCustomObject]@{
  Pipe = $Job
  Result = $Job.BeginInvoke()
 }
}
Write-Host 'Working..' -NoNewline
 Do {
Start-Sleep -Seconds 5
} While ( $Jobs.Result.IsCompleted -contains $false)
Write-Host "Finished."
$(ForEach ($Job in $Jobs)
{ $Job.Pipe.EndInvoke($Job.Result) }) |
 Export-Csv -Path "D:ScriptsReboot-Async-Results.csv" -NoTypeInformation -Append
#clean up runspace
$RunspacePool.Close()
$RunspacePool.Dispose()

为了解决这个问题,我在[PSCustomObject]输出中添加了一个为rebootCheck true或rebootCheck false设置的标志。脚本做的最后一件事是检查这个标志,并执行最后的检查,以确定是否需要重新启动失败的电子邮件。

$counter = 0
do{$counter++
Start-Sleep -Seconds 1
 IF($counter -ge 600){#"Waited too long"
        [PsCustomObject]@{
             "Server" =  $server
             "Status" = "FailedToReboot!"
             "LastRebootTime" = "$LastReboot"
             "CurrentRebootTime" = "FailedToReboot!"
             "ReCheckReboot" = $true
          }#end custom logging object
        exit
 }#end if.
}#end do loop. #Break RebootSentWait continues script on next line.
until (-not (Test-Connection -ComputerName $server -Count 1 -Quiet))

然后在脚本结束前使用IF语句检查名为ReCheckReboot的变量是否为真/假。

最新更新