我的目标是创建一个重新启动计算机两次的 PowerShell 脚本;但是,我对我打算完成此任务的方式有些怀疑。我在中间编写了以下Start-Sleep
脚本Restart-Computer -Force
:
该脚本看起来有点像这样:
Restart-Computer -Force
Start-Sleep -Seconds 300
Restart-Computer -Force
问题是计算机重新启动一次后就不会再重新启动。我有一种直觉,这不对,但我知道还有另一种使用计划任务的方法。然而,当我考虑这个操作时,我认为是的,shutdown /r
所以我尝试了这个:
PowerShell脚本1.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
}
PowerShell脚本2.ps1
shutdown /r
PowerShell脚本3.ps1
shutdown /r
Unregister-ScheduledTask 'LLM' -Confirm:$false
主程序2.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
语句即可实现完全自动化操作。Set-ItemProperty
用于:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
的形式表示)HKCU:
(New-Guid)
)powershell.exe
根据设计 - 鉴于那里指定的任何命令都应该只执行一次- Windows 会在执行时自动删除这样的注册表值(在本例中,在下次登录时)。