#!/bin/pwsh $null = $env:WIN_COMPUTER_NAME; $null = $env:SETUP_SCRIPT_NAME; # Find `winiso` installation medium $drives = & wmic volume get "DriveLetter,Label"; $drive = $($($drives | Select-String -Pattern "winiso") -split "\s+")[0]; [xml]$unattendedConfig = [xml]::new(); $unattendedConfig.PreserveWhitespace = $true; $readerSettings = [System.Xml.XmlReaderSettings]::new(); $readerSettings.IgnoreComments = $true; $reader = [System.Xml.XmlReader]::Create("$drive\Autounattend.template.xml", $readerSettings); $unattendedConfig.Load($reader); $namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $unattendedConfig.NameTable; $namespace.AddNamespace("ua", $unattendedConfig.DocumentElement.NamespaceURI); function Get-PassSettings { [OutputType([xml])] param( [string] $passName ) return $unattendedConfig.SelectSingleNode("/ua:unattend/ua:settings[@pass='$passName']", $namespace); } # Adjust unattended settings $specializeSettings = Get-PassSettings "specialize"; $specializeSettings.SelectSingleNode("./ua:component[@name='Microsoft-Windows-Shell-Setup']/ua:ComputerName", $namespace).InnerText = "$env:WIN_COMPUTER_NAME"; $oobeSystemSettings = Get-PassSettings "oobeSystem"; $oobeSystemSettings.SelectSingleNode("./ua:component/ua:FirstLogonCommands/ua:SynchronousCommand[last()]/ua:CommandLine", $namespace).InnerText += "`npwsh '$env:SETUP_SCRIPT_NAME';"; if ($Global:SetupConfigPostprocessor) { $Global:SetupConfigPostprocessor.Invoke($unattendedConfig, $namespace); } $unattendedConfig.PreserveWhitespace = $true; $unattendedConfig.Save("$drive\Autounattend.xml"); Write-Warning "Attention: This program will completely wipe your current disk #1 and install Windows on it. Are you sure you want to do this?" Read-Host -Prompt "Hit enter to continue or CTRL+C to abort" & "$drive\setup.exe";