2023-07-12 20:37:31 +00:00
|
|
|
#!/bin/pwsh
|
2023-06-21 20:10:19 +00:00
|
|
|
$null = $env:WIN_COMPUTER_NAME;
|
|
|
|
$null = $env:SETUP_SCRIPT_NAME;
|
|
|
|
|
2023-06-22 13:43:16 +00:00
|
|
|
# Find `winiso` installation medium
|
|
|
|
$drives = & wmic volume get "DriveLetter,Label";
|
|
|
|
$drive = $($($drives | Select-String -Pattern "winiso") -split "\s+")[0];
|
2023-06-25 09:49:50 +00:00
|
|
|
[xml]$unattendedConfig = [xml]::new();
|
|
|
|
$unattendedConfig.PreserveWhitespace = $true;
|
|
|
|
|
|
|
|
$readerSettings = [System.Xml.XmlReaderSettings]::new();
|
|
|
|
$readerSettings.IgnoreComments = $true;
|
2024-03-11 16:32:47 +00:00
|
|
|
$reader = [System.Xml.XmlReader]::Create("$PSScriptRoot/../Resources/Autounattend.template.xml", $readerSettings);
|
2023-06-25 09:49:50 +00:00
|
|
|
|
|
|
|
$unattendedConfig.Load($reader);
|
2023-06-22 14:05:10 +00:00
|
|
|
$namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $unattendedConfig.NameTable;
|
|
|
|
$namespace.AddNamespace("ua", $unattendedConfig.DocumentElement.NamespaceURI);
|
2023-06-21 20:10:19 +00:00
|
|
|
|
|
|
|
function Get-PassSettings {
|
|
|
|
[OutputType([xml])]
|
|
|
|
param(
|
|
|
|
[string] $passName
|
|
|
|
)
|
|
|
|
|
2023-06-22 14:05:10 +00:00
|
|
|
return $unattendedConfig.SelectSingleNode("/ua:unattend/ua:settings[@pass='$passName']", $namespace);
|
2023-06-21 20:10:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Adjust unattended settings
|
|
|
|
$specializeSettings = Get-PassSettings "specialize";
|
2023-06-22 14:11:32 +00:00
|
|
|
$specializeSettings.SelectSingleNode("./ua:component[@name='Microsoft-Windows-Shell-Setup']/ua:ComputerName", $namespace).InnerText = "$env:WIN_COMPUTER_NAME";
|
2023-06-21 20:10:19 +00:00
|
|
|
|
2024-03-11 16:32:47 +00:00
|
|
|
# Execute corresponding installer script after startup
|
2023-06-21 20:10:19 +00:00
|
|
|
$oobeSystemSettings = Get-PassSettings "oobeSystem";
|
2024-03-11 16:45:15 +00:00
|
|
|
$installationCommand = $oobeSystemSettings.SelectSingleNode("./ua:component/ua:FirstLogonCommands/ua:SynchronousCommand[last()]", $namespace);
|
2024-03-11 16:46:51 +00:00
|
|
|
$newCommand = $installationCommand.ParentNode.AppendChild($installationCommand.CloneNode($true));
|
2024-03-11 16:32:47 +00:00
|
|
|
|
|
|
|
$newCommand.SelectSingleNode("./ua:CommandLine", $namespace).InnerText = `
|
|
|
|
"powershell -Command " + `
|
|
|
|
$(Get-Content "$PSScriptRoot/InitialBoot.ps1") + `
|
2024-03-21 15:05:55 +00:00
|
|
|
"; pwsh '$([System.IO.Path]::GetRelativePath("$PSScriptRoot/../../..", $env:SETUP_SCRIPT_NAME))';";
|
2024-03-11 16:32:47 +00:00
|
|
|
|
2024-03-23 12:45:15 +00:00
|
|
|
$orderElement = $newCommand.SelectSingleNode("./ua:Order", $namespace);
|
|
|
|
$orderElement.InnerText = ([int]($orderElement.InnerText) + 1);
|
2024-03-11 16:32:47 +00:00
|
|
|
$newCommand.SelectSingleNode("./ua:Description", $namespace).InnerText = "Install PowerShell Core and git and run setup script";
|
2023-06-21 20:10:19 +00:00
|
|
|
|
2024-03-23 12:45:15 +00:00
|
|
|
if (Get-Command Initialize-SetupConfig) {
|
|
|
|
Initialize-SetupConfig $unattendedConfig $namespace;
|
2023-07-03 10:37:02 +00:00
|
|
|
}
|
|
|
|
|
2023-06-22 14:50:40 +00:00
|
|
|
$unattendedConfig.PreserveWhitespace = $true;
|
2024-03-11 16:32:47 +00:00
|
|
|
$unattendedConfig.Save("$drive/Autounattend.xml");
|
2023-06-22 14:17:02 +00:00
|
|
|
|
2023-06-21 20:10:19 +00:00
|
|
|
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";
|