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

我的研究指向使用workflowand foreach -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
4

1 回答 1

1

创建有序哈希表:

$hash = [ordered]@{
    'Server'            =  $using:server
    'Status'            = ...
    "LastRebootTime"    = ...
    'CurrentRebootTime' = ...
}
于 2016-02-29T01:48:36.820 回答