Перезагрузка компьютеров RunSpacePool не фиксирует успех

Я работаю над сценарием, который позже перезагрузит список серверов, используя приведенный ниже сценарий, запланированный в планировщике заданий.

Сценарий использует RunSpacePools для обработки нескольких серверов, но, похоже, мой сценарий не может записать успешную перезагрузку.

Я проверил сервер, перезагруженный с помощью этого сценария, и обнаружил событие с идентификатором 1074 от пользователя USER32, в котором регистрируется событие завершения работы/перезапуска, но в журнале, который я создаю для ведения учета, указано, что перезагрузка не удалась.

Я просто не уверен, как начать устранение этой проблемы. Любая помощь приветствуется!

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 "\\$server\c$")

$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 "\\$server\c$"))

$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:\Scripts\Reboot-Async-Results.csv" -NoTypeInformation -Append
#clean up runspace
$RunspacePool.Close()
$RunspacePool.Dispose()

person user4317867    schedule 25.06.2016    source источник


Ответы (1)


Чтобы решить эту проблему, я добавил флаг, установленный для rebootCheck true или rebootCheck false в выводе [PSCustomObject]. Последнее, что делает сценарий, это проверяет этот флаг и выполняет окончательную проверку, которая определяет, требуется ли электронное письмо с ошибкой перезагрузки.

$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))

Затем переменная с именем ReCheckReboot проверяется на истинность/ложь с помощью оператора IF перед завершением сценария.

person user4317867    schedule 15.07.2016