Meu objetivo é criar um script do PowerShell que reinicie o computador duas vezes; no entanto, tenho algumas dúvidas sobre essa maneira que estou tentando fazer essa tarefa. Eu escrevo o seguinte script com um Start-Sleep
no meio para Restart-Computer -Force
:
O script se parece mais ou menos com isto:
Restart-Computer -Force
Start-Sleep -Seconds 300
Restart-Computer -Force
O problema é que o computador reinicia uma vez e não reinicia novamente. Tenho um pressentimento de que isso está errado, no entanto, sei que há outra maneira de usar tarefas agendadas. No entanto, quando penso na ação, acho que é, shutdown /r
então tentei isso:
PowerShellScript1.ps1
Param(
[Parameter(Mandatory=$true)]
[string]$file1='',
[string]$file2='',
[string]$file3=''
)
$mypath = $PSCommandPath
$cwd = $PSScriptRoot
if ( (-not [String]::IsNullOrWhiteSpace($file2)) -and [String]::IsNullorWhiteSpace($file3))
{
$taskname = "LLM"
$taskExists = Get-ScheduledTask | Where-Object {$_.TaskName -like $taskName }
if($taskExists) {
Unregister-ScheduledTask -Taskname "LLM" -Confirm:$false
}
$taskTrigger = New-ScheduledTaskTrigger -AtLogOn
$taskname = "LLM"
$taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File $mypath -file1 $file2"
# Describe the scheduled task.
$description = "Automation Testing"
$Principal = New-ScheduledTaskPrincipal -UserID "$env:USERDomain\$env:USERNAME" -LogonType ServiceAccount -RunLevel Highest
# Register the scheduled task
try{Register-ScheduledTask -TaskName $taskName -Action $taskAction -Principal $Principal -Trigger $taskTrigger -Description $description
shutdown -r}
catch{
Write-Host $_
}
}
elseif((-not [String]::IsNullOrWhiteSpace($file2)) -and -not [String]::IsNullorWhiteSpace($file3)){
$taskTrigger = New-ScheduledTaskTrigger -AtLogOn
$taskname = "LLM"
$taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File $mypath -file1 $file2 -file2 $file3"
# Describe the scheduled task.
$description = "Automation Testing"
$Principal = New-ScheduledTaskPrincipal -UserID "$env:USERDomain\$env:USERNAME" -LogonType ServiceAccount -RunLevel Highest
# Register the scheduled task
try{Register-ScheduledTask -TaskName $taskName -Action $taskAction -Principal $Principal -Trigger $taskTrigger -Description $description
shutdown -r}
catch{
Write-Host $_
}
}
if ( [String]::IsNullOrWhiteSpace($file2))
{
Unregister-ScheduledTask -Taskname "LLM" -Confirm:$false
shutdown -r
}
PowerShellScript2.ps1
shutdown /r
PowerShellScript3.ps1
shutdown /r
Unregister-ScheduledTask 'LLM' -Confirm:$false
principal2.ps1
Start-Process -WindowStyle hidden -Wait powershell -ArgumentList "$PSScriptRoot\PowerShellScript1.ps1", "$PSScriptRoot\.ps1", "$PSScriptRoot\PowerShellScript3.ps1"
Agora eu tenho duas maneiras de chamar main2.ps1. Posso usar VBS ou Batch. Eu escrevi um arquivo batch que em um clique ele roda como admin, e um script VBS em um clique que roda como admin.
Estou com dificuldade para fazer o script passar por duas reinicializações. Eu estava pensando em escrever um exe em C++ ou C# para usar em vez dos arquivos PowerShell Script, mas não tinha certeza se isso funcionaria.
A abordagem mais simples é usar a chave de registro específica do usuário
RunOnce
para especificar uma ação única para a próxima vez que o usuário atual fizer logon novamente :Observação:
O texto acima inclui um prompt interativo antes de cada reinicialização; basta remover as
Read-Host
instruções para uma operação totalmente automatizada.Set-ItemProperty
é usado para:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
chave do registro (expresso em termos daHKCU:
unidade do PowerShell )(New-Guid)
)powershell.exe
Por padrão, dado que quaisquer comandos especificados ali devem ser executados apenas uma vez , o Windows exclui automaticamente esse valor de registro na execução (durante o próximo logon, neste caso).