我的目标是创建一个可以重新启动计算机两次的 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 脚本文件,但不确定这是否可行。
最简单的方法是使用特定于用户的
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