2016-06-25 3 views
0

작업 스케줄러에서 예약 된 아래 스크립트를 사용하여 나중에 서버 목록을 재부팅 할 스크립트 작업을하고 있습니다.컴퓨터를 재부팅하는 RunSpacePool이 성공을 기록하지 않습니다.

스크립트는 RunSpacePools를 사용하여 여러 서버를 처리하지만 내 스크립트가 성공적으로 재부팅을 기록하지 못합니다.

이 스크립트를 사용하여 재부팅 한 서버를 검사하고 종료/다시 시작 이벤트 을 기록하는 USER32의 이벤트 ID 1074를 발견했지만 기록 보관을 위해 작성한 로그에 재부팅 실패가 표시됩니다.

이 문제를 해결하는 방법을 모르겠습니다. 어떤 도움을 주셔서 감사합니다!

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

답변

0

이것을 해결하기 위해, I는 [PSCustomObject] 출력 거짓 또는 참 rebootCheck rebootCheck 대해 설정된 플래그를 추가했다. 마지막으로 스크립트에서이 플래그를 확인하고 실패한 전자 메일 재부팅이 필요한지를 확인하는 최종 검사를 수행합니다.

$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 문을 사용하여 검사한다.