first commit
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Enables all Windows features required for WSL 2 on Windows 11 and installs the latest Ubuntu distribution.
|
||||
|
||||
.DESCRIPTION
|
||||
This script must be run as Administrator. It will:
|
||||
1. Enable the "Microsoft-Windows-Subsystem-Linux" and "VirtualMachinePlatform" optional features.
|
||||
2. Set WSL 2 as the default WSL version.
|
||||
3. Install/update the WSL kernel components.
|
||||
4. Install the latest Ubuntu distribution from the Microsoft Store catalog (via `wsl --install -d Ubuntu`).
|
||||
|
||||
A restart may be required after enabling the Windows features for the first time. If a restart is
|
||||
needed, the script will detect it, prompt you, and re-run automatically after reboot (via a scheduled
|
||||
task) unless you decline.
|
||||
|
||||
.NOTES
|
||||
Run this script from an elevated PowerShell prompt:
|
||||
powershell -ExecutionPolicy Bypass -File .\Install-WSL2Ubuntu.ps1
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$Distribution = "Ubuntu"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
function Test-IsAdmin {
|
||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
|
||||
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
}
|
||||
|
||||
function Write-Step {
|
||||
param([string]$Message)
|
||||
Write-Host "`n==> $Message" -ForegroundColor Cyan
|
||||
}
|
||||
|
||||
if (-not (Test-IsAdmin)) {
|
||||
Write-Error "This script must be run as Administrator. Right-click PowerShell and choose 'Run as Administrator', then re-run this script."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# --- Step 1: Enable required Windows optional features ---
|
||||
Write-Step "Enabling 'Windows Subsystem for Linux' feature"
|
||||
$wslFeature = Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart
|
||||
|
||||
Write-Step "Enabling 'Virtual Machine Platform' feature"
|
||||
$vmpFeature = Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart
|
||||
|
||||
$restartNeeded = $wslFeature.RestartNeeded -or $vmpFeature.RestartNeeded
|
||||
|
||||
if ($restartNeeded) {
|
||||
Write-Host "`nA restart is required to finish enabling the WSL 2 prerequisites." -ForegroundColor Yellow
|
||||
$answer = Read-Host "Restart now and continue installation automatically after reboot? (Y/N)"
|
||||
|
||||
if ($answer -match '^[Yy]') {
|
||||
Write-Step "Scheduling this script to resume after reboot"
|
||||
|
||||
$scriptPath = $MyInvocation.MyCommand.Path
|
||||
$taskName = "Resume-WSL2Install"
|
||||
|
||||
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
|
||||
-Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`" -Distribution `"$Distribution`""
|
||||
$trigger = New-ScheduledTaskTrigger -AtLogOn
|
||||
$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -RunLevel Highest
|
||||
|
||||
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Principal $principal -Force | Out-Null
|
||||
|
||||
Write-Host "Restarting in 10 seconds... (Ctrl+C to cancel)" -ForegroundColor Yellow
|
||||
Start-Sleep -Seconds 10
|
||||
Restart-Computer -Force
|
||||
exit 0
|
||||
}
|
||||
else {
|
||||
Write-Host "Please restart your computer manually, then re-run this script to continue." -ForegroundColor Yellow
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
|
||||
# If we get here after a reboot via the scheduled task, clean it up.
|
||||
$existingTask = Get-ScheduledTask -TaskName "Resume-WSL2Install" -ErrorAction SilentlyContinue
|
||||
if ($existingTask) {
|
||||
Unregister-ScheduledTask -TaskName "Resume-WSL2Install" -Confirm:$false
|
||||
}
|
||||
|
||||
# --- Step 2: Update WSL and set default version to 2 ---
|
||||
Write-Step "Updating the WSL kernel components"
|
||||
wsl --update
|
||||
|
||||
Write-Step "Setting WSL default version to 2"
|
||||
wsl --set-default-version 2
|
||||
|
||||
# --- Step 3: Install the latest Ubuntu distribution ---
|
||||
Write-Step "Checking for an existing '$Distribution' installation"
|
||||
$installedDistros = (wsl --list --quiet 2>$null) -replace "`0", ""
|
||||
|
||||
if ($installedDistros -match [regex]::Escape($Distribution)) {
|
||||
Write-Host "'$Distribution' is already installed. Skipping installation." -ForegroundColor Green
|
||||
}
|
||||
else {
|
||||
Write-Step "Installing '$Distribution' (latest version from Microsoft Store)"
|
||||
wsl --install -d $Distribution --no-launch
|
||||
}
|
||||
|
||||
Write-Step "Done"
|
||||
Write-Host "WSL 2 features are enabled and '$Distribution' has been installed." -ForegroundColor Green
|
||||
Write-Host "Launch it by running: wsl -d $Distribution" -ForegroundColor Green
|
||||
Write-Host "On first launch you'll be asked to create a Unix username and password." -ForegroundColor Green
|
||||
Reference in New Issue
Block a user