Powershell - 재부팅 후 스크립트 계속
나는 Powershell 스크립트를 스크립트에서 reboot을 호출한 후 중단되었던 부분에서 계속 진행할 방법을 찾고 있습니다.예를 들어 Powershell 자동화를 통해 DC를 구축하고 있으며 PC 이름을 TESTDC01로 변경한 후 재부팅해야 하지만 재부팅 후 dcpromo 등으로 이동하는 스크립트를 계속 진행합니다.
이것이 가능합니까?
건배!
TechNet에 대한 Scripting Guy 시리즈의 훌륭한 기사가 있습니다. 이 기사는 귀하가 설명하는 것과 매우 유사한 상황을 설명합니다.컴퓨터 이름을 변경하고 재부팅 후 스크립트를 다시 시작합니다.버전 3의 일부인 새 워크플로우를 사용하는 것이 유용합니다.
workflow Rename-And-Reboot {
param ([string]$Name)
Rename-Computer -NewName $Name -Force -Passthru
Restart-Computer -Wait
Do-MoreStuff
}
워크플로가 선언되면(변수에 할당하지 않음) 일반 cmdlet인 것처럼 워크플로를 호출할 수 있습니다.진짜 마법은-Wait
재시작-컴퓨터 cmdlet의 매개 변수입니다.
Rename-And-Reboot PowerShellWorkflows
출처: https://devblogs.microsoft.com/scripting/powershell-workflows-restarting-the-computer/
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" }
}
작은 스크립트를 진행할 때 상태를 적절하게 설정해야 합니다.
위의 답변은 사실이지만 파워셸 스크립트의 원격 실행에만 적용됩니다.Windows 웹 포털에 따르면 로컬 컴퓨터를 다시 시작한 후 로컬에서 실행 중인 스크립트를 중단된 위치에서 다시 시작하는 방법은 다음과 같습니다.
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로 설정해야 합니다.
워크플로우가 포함된 PS 3.0을 확인하십시오.저는 아직 그들과 함께 일하지 않았지만, 그들은 다시 시작하면 회복될 것입니다.
만약 이것이 누군가에게 도움이 된다면, 제가 하는 일은 서버를 재부팅한 후 다음에\\server\c$
오프라인이 됩니다.다음 I 루프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"
}
로컬 컴퓨터를 재부팅하고 스크립트를 계속해야 합니다.@adaml에서 솔루션을 시도했지만 다시 시작해야 하는 일시 중단된 워크플로 작업을 찾을 예약된 작업(재부팅 후 실행된 작업)을 가져오지 못했습니다.따라서, 그것은 중단된 채로 남아 있었습니다.
Get-Job은 자격 증명 또는 상승에 관계없이 작업을 반환하지 않았습니다.또 다른 이상한 점은 Powershell ISE에서 코드를 표시하여 워크플로우를 실행하고 F8로 섹션을 실행하면 작업이 중단되지 않는다는 것이었습니다.전체 스크립트를 F5로 실행하거나 다른 곳에서 호출해야 했습니다.
작업의 이력서를 얻으려면 예약된 작업 대신 예약된 작업을 등록해야 했습니다.
workflow test-restart {
Write-Output "Before reboot" | Out-File C:/Log/t.txt -Append
Restart-Computer -Wait
Write-Output "$Now2 After reboot" | Out-File C:/Log/t.txt -Append
}
$PSPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$Args = '-NonInteractive -WindowStyle Hidden -NoLogo -NoProfile -NoExit -Command "& {Import-Module PSWorkflow ; Get-Job | Resume-Job}"'
$Action = New-ScheduledTaskAction -Execute $PSPath -Argument $Args
$Option = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -WakeToRun
$Trigger = New-JobTrigger -AtStartUp -RandomDelay (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName ResumeJob -Action $Action -Trigger $Trigger -Settings $Option -RunLevel Highest
test-restart -AsJob
원격으로 수행:
Rename-Computer -ComputerName $computer -NewName "TESTDC01" -DomainCredential $domain\$username -Force -Restart
그리고 그 8부터 스크립트를 계속합니다.)
AWS/Your Cloud Provider에서 이러한 작업을 수행하는 사람들의 이익을 위해 크게 생각해 보십시오.
클라이언트 표준 서버 이름, +domain join, +cert install, +Tentacle install로 이름을 변경해야 하는 AWS 인스턴스와 동일한 문제가 있습니다.서버 시작 스크립트를 테라폼을 통해 인스턴스의 user_data 필드에 넣도록 하겠습니다.
설정의 각 부분이 끝난 후 인스턴스의 PS에서 EC2 인스턴스 "Renamed" 태그를 설정하여 이름을 바꾼 후 서버를 다시 시작할 때 스크립트는 "Renamed = Done" 태그 값을 찾고 다음 번 인스턴스 부팅 시 이 부분을 건너뜁니다.도메인 가입, Tentacle에 대한 동일한 논리설치된 태그 등
태그를 읽는 코드는 다음과 같습니다.
$instanceId = (Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id)
$instance = ((Get-EC2Instance -region $region -Instance $instanceId).RunningInstance)
$myInstance = $instance | Where-Object { $_.InstanceId -eq $instanceId }
$Renamed = ($myInstance.Tags | Where-Object { $_.Key -eq "Renamed" }).Value
언급URL : https://stackoverflow.com/questions/15166839/powershell-reboot-and-continue-script
'IT' 카테고리의 다른 글
날짜를 각도 2에서 이 'yyyy-MM-dd' 형식으로 변환하는 방법 (0) | 2023.08.16 |
---|---|
지정된 프로젝트에 대해 올바른 ID(이름 및 이메일)를 사용하도록 GIT에 지시하는 방법은 무엇입니까? (0) | 2023.08.16 |
모든 MySQL 테이블 행을 동시에 업데이트하는 방법은 무엇입니까? (0) | 2023.08.11 |
구성 요소와 지침의 차이점은 무엇입니까? (0) | 2023.08.11 |
Excel 표에서 열 수를 선택하기 위한 VBA (0) | 2023.08.11 |