2016-02-29 43 views
0

我正在使用以下代碼來安排服務器重新啓動。這適用於少數服務器,但在有許多服務器(超過80臺服務器)時會成爲問題,因爲每個服務器需要很長時間的Register-ScheduledJob使用日誌記錄爲並行計劃服務器重新啓動創建工作流程

$user = Get-Credential -UserName $env:USERNAME -Message "UserName/password for scheduled Reboot" 
$trigger = New-JobTrigger -once -at $date 
$script = [ScriptBlock]::Create("D:\Scripts\Scheduled-Reboot-Single.ps1 -server $server") 
Register-ScheduledJob -Name $server -Credential $user -Trigger $trigger -ScriptBlock $script 

我的研究指出,使用workflowforeach -parallel

我遇到的問題是準確的日誌記錄。我的日誌文件已創建,但列未正確排序。

workflow Do-ScheduledReboot{ 
    Param([string[]]$servers) 

    foreach -parallel($server in $servers) { 

    InlineScript { 
     try { 
     $LastReboot = Get-EventLog -ComputerName $using:server -LogName system | 
         Where-Object {$_.EventID -eq '6005'} | 
         Select -ExpandProperty TimeGenerated | 
         select -first 1 

     #New loop with counter, exit script if server did not reboot. 
     $max = 20; $i = 0 
     do { 
      if ($i -gt $max) { 
      $hash = @{ 
       "Server" = $using:server 
       "Status" = "FailedToReboot!" 
       "LastRebootTime" = "$LastReboot" 
       "CurrentRebootTime" = "FailedToReboot!" 
      } 
      $newRow = New-Object PsObject -Property $hash 
      $rnd = Get-Random -Minimum 5 -Maximum 40 
      Start-Sleep -Seconds $rnd 
      Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force 

      exit 
      }#exit script and log failed to reboot. 
      $i++ 

      Start-Sleep -Seconds 15 
     } while (Test-path "\\$using:server\c$") 
     $max = 20; $i = 0 
     do { 
      if ($i -gt $max) { 
      $hash = @{ 
       "Server" = $using:server 
       "Status" = "FailedToComeOnline!" 
       "LastRebootTime" = "$LastReboot" 
       "CurrentRebootTime" = "FailedToReboot!" 
      } 
      $newRow = New-Object PsObject -Property $hash 
      $rnd = Get-Random -Minimum 5 -Maximum 40 
      Start-Sleep -Seconds $rnd 
      Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force 

      exit 
      }#exit script and log failed to come online. 
      $i++ 

      Start-Sleep -Seconds 15 
     } while (-not(Test-path "\\$using:server\c$")) 

     $CurrentReboot = Get-EventLog -ComputerName $using:server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1 
     $hash = @{ 
      "Server" = $using:server 
      "Status" = "RebootSuccessful" 
      "LastRebootTime" = $LastReboot 
      "CurrentRebootTime" = "$CurrentReboot" 
     } 

     $newRow = New-Object PsObject -Property $hash 
     $rnd = Get-Random -Minimum 5 -Maximum 40 
     Start-Sleep -Seconds $rnd 
     Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force 
     } catch { 
     $errMsg = $_.Exception 
     "Failed with $errMsg" 
     }#end catch 
    }#end inline script 
    }#end foreach parallel 
}#end workflow 

$mylist = gc D:\Servers.txt 
Do-ScheduledReboot -servers $mylist 

回答

1

創建有序的哈希表:

$hash = [ordered]@{ 
    'Server'   = $using:server 
    'Status'   = ... 
    "LastRebootTime" = ... 
    'CurrentRebootTime' = ... 
} 
+0

看起來不錯,謝謝你。有沒有辦法讓'foreach-parallel'跑得更快?在處理方面有所改進,但與RunSpacePools相比,它仍然非常慢。 – user4317867

+0

我不這麼認爲,但我對工作流程很少有經驗。 –

+0

這意味着RunSpacePools獲勝。我將繼續沿着這條道路前進,謝謝! – user4317867

相關問題