2016-06-25 8 views
0

私は、後でタスクスケジューラでスケジュールされた以下のスクリプトを使用してサーバーの一覧を再起動するスクリプトを作成しています。RunSpacePoolでコンピュータの再起動が成功しません。

スクリプトはRunSpacePoolsを使用して複数のサーバーを処理しますが、スクリプトが正常に再起動したことを記録できません。

このスクリプトを使用して再起動したサーバーを確認し、シャットダウン/再起動イベントを記録するイベントID 1074がUSER32から検出されましたが、記録保持用に作成するログにReboot Failedと表示されます。

この問題のトラブルシューティングを開始する方法がわかりません。どんな援助もありがとう!この問題を解決するには

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

、私は[PSCustomObject]出力にrebootCheck真または偽rebootCheckのために設定されているフラグを追加しました。スクリプトが最後に行うことは、このフラグをチェックして、Reboot Failed電子メールが必要かどうかを判断する最終チェックを実行することです。

$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文を使用して、真/偽のためにチェックされています。

関連する問題