在计算机上结合使用 Batch 或 VBS 和 PowerShell 脚本重新启动计算机两次

问题描述 投票:0回答:1

我的目标是创建一个可以重新启动计算机两次的 PowerShell 脚本;然而,我对我完成这项任务的目的有一些疑问。我编写了以下脚本,中间有一个

Start-Sleep
Restart-Computer -Force
:

脚本看起来有点像这样:

Restart-Computer -Force

Start-Sleep -Seconds 300

Restart-Computer -Force

问题是计算机重新启动一次后就不再重新启动。我有一种直觉,这是错误的,但是,我知道还有另一种使用计划任务的方法。然而,当我想到这个动作时,我认为它是

shutdown /r
,所以我尝试了这个:

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

main2.ps1

Start-Process -WindowStyle hidden -Wait powershell -ArgumentList "$PSScriptRoot\PowerShellScript1.ps1", "$PSScriptRoot\.ps1", "$PSScriptRoot\PowerShellScript3.ps1"

现在我有两种调用 main2.ps1 的方法,我可以使用 VBS,也可以使用 Batch。我编写了一个批处理文件,一键以管理员身份运行,以及一个一键以管理员身份运行的 VBS 脚本。

我在让脚本循环两次重新启动时遇到困难。我正在考虑用 C++ 或 C# 编写一个 exe 来代替 PowerShell 脚本文件,但不确定这是否可行。

powershell scheduled-tasks restart
1个回答
0
投票

最简单的方法是使用特定于用户的

RunOnce
注册表项来指定当前用户下次再次登录时的一次性操作:

Read-Host 'Press enter to initiate the 1st restart.'

Set-ItemProperty HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce (New-Guid) @'
powershell.exe -noprofile -c "Read-Host \"Press enter to restart again.\"; Restart-Computer -Force"
'@

Restart-Computer -Force
© www.soinside.com 2019 - 2024. All rights reserved.