# ========================================================= # MAX Windows Toolkit - 安装和管理 WSL # 中文界面,统一风格 # 功能:安装/启用 WSL、设置 WSL 2、安装 Linux 发行版 # ========================================================= $Common = "C:\Setup\windows\lib\common.ps1" if (Test-Path $Common) { . $Common } Write-Header "安装和管理 WSL" Show-AdminWarn # --------------------------------------------------------- # 辅助函数 # --------------------------------------------------------- function Test-CommandExists { param( [string]$Command ) $cmd = Get-Command $Command -ErrorAction SilentlyContinue return ($null -ne $cmd) } function Get-WindowsVersionInfo { try { $cv = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" $ProductName = $cv.ProductName $EditionID = $cv.EditionID $Build = [int]$cv.CurrentBuild $UBR = $cv.UBR $DisplayVersion = $cv.DisplayVersion return [PSCustomObject]@{ ProductName = $ProductName EditionID = $EditionID Build = $Build UBR = $UBR DisplayVersion = $DisplayVersion } } catch { return $null } } function Show-SystemInfoForWSL { Write-Section "Windows 系统信息" $info = Get-WindowsVersionInfo if ($info) { Write-Info "ProductName : $($info.ProductName)" Write-Info "EditionID : $($info.EditionID)" Write-Info "Build : $($info.Build)" Write-Info "UBR : $($info.UBR)" Write-Info "DisplayVersion : $($info.DisplayVersion)" } else { Write-Warn "无法读取 Windows 版本信息" } Write-Info "" } function Show-WSLStatus { Write-Section "WSL 状态" Show-SystemInfoForWSL if (-not (Test-CommandExists "wsl.exe")) { Write-Warn "未找到 wsl.exe" Write-Warn "此 Windows 版本可能不支持现代 WSL 命令" return } Write-Info "WSL 可执行文件:" try { where.exe wsl } catch {} Write-Info "" Write-Info "WSL 版本:" try { wsl.exe --version } catch { Write-Warn "此系统不支持 wsl --version" } Write-Info "" Write-Info "已安装的发行版:" try { wsl.exe --list --verbose } catch { Write-Warn "无法列出已安装的发行版" Write-Muted $_.Exception.Message } Write-Info "" } function Enable-WSLFeatures { Write-Section "启用 WSL 所需功能" if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } Write-Info "正在启用 Windows Subsystem for Linux..." try { dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart } catch { Write-Warn "启用 Microsoft-Windows-Subsystem-Linux 失败" Write-Muted $_.Exception.Message } Write-Info "" Write-Info "正在启用 Virtual Machine Platform..." try { dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart } catch { Write-Warn "启用 VirtualMachinePlatform 失败" Write-Muted $_.Exception.Message } Write-Info "" Write-OK "功能启用命令已完成" Write-Warn "可能需要重启系统后才能正常使用 WSL 2" } function Update-WSL { Write-Section "更新 WSL" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "正在更新 WSL..." try { wsl.exe --update Write-OK "WSL 更新命令已完成" } catch { Write-Warn "WSL 更新失败" Write-Muted $_.Exception.Message } } function Set-WSL2Default { Write-Section "设置 WSL 2 为默认版本" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "正在设置 WSL 2 为默认版本..." try { wsl.exe --set-default-version 2 Write-OK "默认 WSL 版本已设置为 2" } catch { Write-Warn "设置默认 WSL 版本失败" Write-Muted $_.Exception.Message } } function Show-OnlineDistributions { Write-Section "可用 WSL 发行版" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "在线可用发行版:" Write-Info "" try { wsl.exe --list --online } catch { Write-Err "列出在线发行版失败" Write-Muted $_.Exception.Message } } function Install-WSLDefault { Write-Section "安装默认 WSL Ubuntu" if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } Write-Info "这将安装 WSL 和默认的 Ubuntu 发行版。" Write-Muted "命令: wsl --install" Write-Info "" Write-Warn "安装后可能需要重启系统。" Write-Info "" try { wsl.exe --install Write-Info "" Write-OK "WSL 安装命令已完成" Write-Warn "如提示请重启 Windows" } catch { Write-Err "WSL 安装失败" Write-Muted $_.Exception.Message } } function Install-WSLDistribution { Write-Section "安装指定 WSL 发行版" if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "常见发行版名称:" Write-Info "- Ubuntu" Write-Info "- Debian" Write-Info "- kali-linux" Write-Info "- openSUSE-Tumbleweed" Write-Info "- Ubuntu-24.04" Write-Info "- Ubuntu-22.04" Write-Info "" Write-Warn "可先选择选项 4 列出在线发行版" Write-Info "" $Distro = Read-Host "发行版名称,默认: Ubuntu" if ([string]::IsNullOrWhiteSpace($Distro)) { $Distro = "Ubuntu" } Write-Info "" Write-Info "正在安装 WSL 发行版: $Distro" Write-Muted "命令: wsl --install -d $Distro" Write-Info "" try { wsl.exe --install -d $Distro Write-Info "" Write-OK "WSL 发行版安装命令已完成" Write-Warn "如提示请重启 Windows" } catch { Write-Err "WSL 发行版安装失败" Write-Muted $_.Exception.Message } } function Install-WSLDistributionWebDownload { Write-Section "通过网络下载安装 WSL 发行版" if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "此模式使用 --web-download 参数。" Write-Warn "当 Microsoft Store 安装不可用或卡住时很有用。" Write-Info "" $Distro = Read-Host "发行版名称,默认: Ubuntu" if ([string]::IsNullOrWhiteSpace($Distro)) { $Distro = "Ubuntu" } Write-Info "" Write-Info "正在通过网络下载安装 WSL 发行版: $Distro" Write-Muted "命令: wsl --install --web-download -d $Distro" Write-Info "" try { wsl.exe --install --web-download -d $Distro Write-Info "" Write-OK "WSL 网络下载安装命令已完成" Write-Warn "如提示请重启 Windows" } catch { Write-Err "WSL 网络下载安装失败" Write-Muted $_.Exception.Message } } function Set-DefaultDistribution { Write-Section "设置默认 WSL 发行版" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } Write-Info "已安装的发行版:" try { wsl.exe --list --verbose } catch {} Write-Info "" $Distro = Read-Host "要设为默认的发行版名称" if ([string]::IsNullOrWhiteSpace($Distro)) { Write-Err "发行版名称不能为空" return } try { wsl.exe --set-default $Distro Write-OK "默认 WSL 发行版已设置为: $Distro" } catch { Write-Err "设置默认发行版失败" Write-Muted $_.Exception.Message } } function Shutdown-WSL { Write-Section "关闭 WSL" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } try { wsl.exe --shutdown Write-OK "WSL 已关闭" } catch { Write-Err "关闭 WSL 失败" Write-Muted $_.Exception.Message } } function Open-WSL { Write-Section "打开 WSL" if (-not (Test-CommandExists "wsl.exe")) { Write-Err "未找到 wsl.exe" return } try { Start-Process wsl.exe Write-OK "WSL 已打开" } catch { Write-Err "打开 WSL 失败" Write-Muted $_.Exception.Message } } function Show-WSLTips { Write-Section "WSL 使用提示" Write-Info "推荐命令:" Write-Info " wsl --install" Write-Info " wsl --list --online" Write-Info " wsl --install -d Ubuntu" Write-Info " wsl --install --web-download -d Ubuntu" Write-Info " wsl --list --verbose" Write-Info " wsl --set-default-version 2" Write-Info " wsl --set-default Ubuntu" Write-Info " wsl --shutdown" Write-Info "" Write-Info "推荐发行版:" Write-Info "- Ubuntu: 通用用途" Write-Info "- Debian: 轻量稳定" Write-Info "- kali-linux: 安全测试工具" Write-Info "" Write-Warn "注意事项:" Write-Warn "- WSL 2 需要虚拟化支持" Write-Warn "- 如果 WSL 2 无法启动,请在 BIOS/UEFI 中启用虚拟化" Write-Warn "- 启用 Windows 功能后请重启 Windows" Write-Warn "- 首次启动发行版时会要求创建 Linux 用户名和密码" } function Run-RecommendedWSLInstall { Write-Section "推荐的 WSL 安装流程" if (-not (Test-IsAdmin)) { Write-Err "请以管理员身份运行 PowerShell" return } Write-Info "推荐流程:" Write-Info "- 启用 WSL 所需功能" Write-Info "- 更新 WSL" Write-Info "- 设置 WSL 2 为默认版本" Write-Info "- 通过网络下载安装 Ubuntu" Write-Info "" Write-Warn "安装后可能需要重启系统。" Write-Info "" $Confirm = Read-Host "是否继续?输入 YES 确认" if ($Confirm -ne "YES") { Write-Warn "已取消" return } Enable-WSLFeatures Update-WSL Set-WSL2Default Write-Info "" Write-Info "正在安装 Ubuntu..." try { wsl.exe --install --web-download -d Ubuntu Write-OK "Ubuntu 安装命令已完成" } catch { Write-Warn "通过网络下载安装 Ubuntu 失败,尝试普通安装..." try { wsl.exe --install -d Ubuntu } catch { Write-Err "Ubuntu 安装失败" Write-Muted $_.Exception.Message } } Write-Info "" Write-OK "推荐的 WSL 安装流程已完成" Write-Warn "如提示请重启 Windows" } # --------------------------------------------------------- # 主菜单循环 # --------------------------------------------------------- :wslLoop while ($true) { Clear-Host Write-Header "安装和管理 WSL" Write-Info "1. 推荐安装 WSL + Ubuntu" Write-Info "2. 启用 WSL 所需 Windows 功能" Write-Info "3. 安装默认 WSL Ubuntu" Write-Info "4. 列出在线发行版" Write-Info "5. 安装指定发行版" Write-Info "6. 通过网络下载安装指定发行版" Write-Info "7. 设置 WSL 2 为默认版本" Write-Info "8. 更新 WSL" Write-Info "9. 显示 WSL 状态" Write-Info "10. 设置默认发行版" Write-Info "11. 打开 WSL" Write-Info "12. 关闭 WSL" Write-Info "13. WSL 使用提示" Write-Info "0. 退出" Write-Info "" $Choice = Read-Host "请选择" switch ($Choice) { "1" { Run-RecommendedWSLInstall Pause-Max } "2" { Enable-WSLFeatures Pause-Max } "3" { Install-WSLDefault Pause-Max } "4" { Show-OnlineDistributions Pause-Max } "5" { Install-WSLDistribution Pause-Max } "6" { Install-WSLDistributionWebDownload Pause-Max } "7" { Set-WSL2Default Pause-Max } "8" { Update-WSL Pause-Max } "9" { Show-WSLStatus Pause-Max } "10" { Set-DefaultDistribution Pause-Max } "11" { Open-WSL Pause-Max } "12" { Shutdown-WSL Pause-Max } "13" { Show-WSLTips Pause-Max } "0" { break :wslLoop } default { Write-Err "无效选项" Pause-Max } } }