PowerShell的 - 重新启动并继续脚本(Powershell - Reboot and Co

2019-07-20 19:39发布

我正在寻找一种方式来继续从它调用的脚本在重新启动后离开的地方PowerShell脚本。 例如,我建立一个DC通过PowerShell的自动化,并重新命名PC到TESTDC01后,需要重新启动,但重新启动后,继续用脚本去到DCPROMO等。

这可能吗?

干杯!

Answer 1:

有TechNet上的一个伟大的文章从您好,脚本专家系列越过非常相似,你所描述的情况:重命名计算机并重新启动后恢复脚本。 神奇的是使用新的工作流是3版本的一部分:

workflow Rename-And-Reboot {
  param ([string]$Name)
  Rename-Computer -NewName $Name -Force -Passthru
  Restart-Computer -Wait
  Do-MoreStuff
}

一旦工作流程已申报(你不把它分配给一个变量),你可以调用它,就好像它是一个常规的小命令。 真正的法宝是-Wait在重启电脑cmdlet的参数。

Rename-And-Reboot PowerShellWorkflows

来源: http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/23/powershell-workflows-restarting-the-computer.aspx

如果PowerShell的V3或更高版本不是一个可用的选择,你可能会破坏你现有的脚本为多个较小的脚本和有运行在启动一个主脚本,检查一些地方保存的状态(文件,注册表等),然后开始执行新的脚本来继续在适当情况下。 就像是:

$state = Get-MyCoolPersistedState
switch ($state) {
  "Stage1" { . \Path\To\Stage1.ps1 ; break }
  "Stage2" { . \Path\To\Stage2.ps1 ; break }
  "Stage3" { . \Path\To\Stage3.ps1 ; break }
  default { "Uh, something unexpected happened" }
}

只是一定要记住,你通过你的小脚本移动到适当地设置你的状态。



Answer 2:

上面的回答是真实的,但它仅适用于PowerShell脚本的远程执行。 按照窗口门户网站 ,该方法有从它离开的地方重新开始后,在本地机器就像是让你在本地运行脚本的简历:

workflow Resume_Workflow
{
    .....
    Rename-Computer -NewName some_name -Force -Passthru
    Restart-Computer -Wait
    # Do some stuff
    .....
}
# Create the scheduled job properties
$options = New-ScheduledJobOption -RunElevated -ContinueIfGoingOnBattery -StartIfOnBattery
$secpasswd = ConvertTo-SecureString "Aa123456!" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ("WELCOME\Administrator", $secpasswd)
$AtStartup = New-JobTrigger -AtStartup

# Register the scheduled job
Register-ScheduledJob -Name Resume_Workflow_Job -Trigger $AtStartup -ScriptBlock ({[System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager = $true; Import-Module PSWorkflow; Resume-Job -Name new_resume_workflow_job -Wait}) -ScheduledJobOption $options
# Execute the workflow as a new job
Resume_Workflow -AsJob -JobName new_resume_workflow_job

需要注意的是, [System.Management.Automation.Remoting.PSSessionConfigurationData]::IsServerManager标志应当设置为true,只有在工作流操作是为了重启后在本地执行。



Answer 3:

看看PS 3.0工作流程。 我还没有和他们还没有工作,但他们想从重新启动恢复。



Answer 4:

如果这可以帮助任何人,我做的是重新启动服务器,然后循环,直到\\server\c$下线。 接下来,我环路While (-not(Test-path "\\$server\c$"))确认服务器再次重新上线,只是继续我的脚本。

此代码工作,但肯定可以得到改善。 它产生被重新启动服务器的CSV日志。 还应该在PowerShell的v2和更新工作。

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

 (Invoke-WmiMethod -ComputerName $server -Path "Win32_Service.Name='HealthService'" -Name PauseService).ReturnValue | Out-Null

Restart-Computer -ComputerName $server -Force

#New loop with counter, exit script if server did not reboot.
$max = 20;$i = 0
 DO{
 IF($i -gt $max){
        $hash = @{
             "Server" =  $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:\RebootResults.csv -InputObject $newrow -Append -Force
    "Failed to reboot $server"
    exit}#exit script and log failed to reboot.
    $i++
"Wait for server to reboot"
    Start-Sleep -Seconds 15
}#end DO
While (Test-path "\\$server\c$")

$max = 20;$i = 0
 DO{
 IF($i -gt $max){
        $hash = @{
             "Server" =  $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:\RebootResults.csv -InputObject $newrow -Append -Force
    "$server did not come online"
    exit}#exit script and log failed to come online.
    $i++
    "Wait for [$server] to come online"
    Start-Sleep -Seconds 15
}#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
    $hash = @{
             "Server" =  $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:\RebootResults.csv -InputObject $newrow -Append -Force

}#End Try.

Catch{
 $errMsg = $_.Exception
 "Failed with $errMsg"
}


文章来源: Powershell - Reboot and Continue Script