using namespace Microsoft.Win32; . "$PSScriptRoot/Scripting.ps1"; $null = New-Module { [RegistryKey] $key = $null; $runOncePath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"; $runOnceName = "PortValhalla"; <# .SYNOPSIS Gets the reghistry key containing the `RunOnce` commands. #> function Get-RunOnceKey { Get-Item $runOncePath; } <# .SYNOPSIS Registers a task to run the setup once after the next reboot. .PARAMETER UserKey The regtistry key of the user to register the task for. #> function Register-Setup { param( [RegistryKey] $UserKey ) $key = Get-RunOnceKey $UserKey; Set-ItemProperty -Path $key.PSPath -Name $runOnceName -Type "ExpandString" -Value ( "pwsh -Command " + "`$env:PWSH_PATH = $(ConvertTo-Injection $env:PWSH_PATH);" + "`$env:INSTALLER_SCRIPT = $(ConvertTo-Injection $env:INSTALLER_SCRIPT);" + "`$env:CONFIG_MODULE = $(ConvertTo-Injection $env:CONFIG_MODULE);" + "& `$env:INSTALLER_SCRIPT;" ); $key.Handle.Close(); } <# .SYNOPSIS Reboots the machine intermediately and restarts the setup after the next login. #> function Restart-Intermediate { Register-Setup; Restart-Computer; } }