
一个 PowerShell 脚本如何把 Windows 11 安卓子系统装进系统WSA Install.ps1 完整拆解【免费下载链接】WSABuildsRun Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU (root solutions) built in.项目地址: https://gitcode.com/GitHub_Trending/ws/WSABuilds双击脚本后的 30 秒你在 WSABuilds 定制包的解压目录里双击了 Run.bat黑窗口标题变成 “Installing MagiskOnWSA”。接下来 30 秒Install.ps1会自动完成这些事忘了点“以管理员身份运行”就弹 UAC 重新跑自己打开 Virtual Machine Platform 开关读AppxManifest.xml逐个补装依赖包最后用一条Add-AppxPackage把 WSAWindows Subsystem for Android注册进系统。这张地图先看清楚用户入口是同目录一行壳脚本 Run.bat它只做一件事用powershell.exe -ExecutionPolicy Bypass拉起MagiskOnWSA/installer/Install.ps1。整个脚本是 180 行线性主流程加 4 个小函数执行顺序是一条直线UAC 权限闸门 → filelist.txt 完整性检查 → MakePri 资源合并 → 注册表虚拟化开关 → 依赖 Appx 安装 → 旧 WSA 处理 → WsaClient 关闭 → Appx 注册 → 收尾或回滚4 个函数各管一事Test-Administrator判管理员Test-CommandExist探测命令是否存在Get-InstalledDependencyVersion查已装依赖版本Finish装完收尾。带着这条顺序往下读后面每个设计都能对上号。⚙️ 它是怎么一步步把 WSA 装上的开机第一道关管理员权限与 PowerShell 选择如果用户忘记“以管理员身份运行”后面所有注册表写入和 Appx 注册都会失败所以脚本第一件事就是拦住这种情况并自我提权If (-Not (Test-Administrator)) { Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force $Proc Start-Process -PassThru -Verb RunAs $pwsh -Args ... $PSCommandPath EVAL # ... 等新进程结束失败则提示后退出 exit } ElseIf (($args.Count -Eq 1) -And ($args[0] -Eq EVAL)) { Start-Process $pwsh -NoNewWindow -Args ... $PSCommandPath exit }EVAL参数是个二段式自我重启原进程等新窗口跑完新窗口见着 EVAL 就直接重跑脚本本体。否则提权后的新进程会再次触发 UAC陷入提权循环。这里有个容易看错的地方Check-Windows11只用来决定 Windows 11 上是否优先选 pwsh.exe并不是版本闸门——脚本并没有拒绝在 Windows 10 上跑这也是项目同时支持 Win10/11 的原因。打地基注册表免密钥匙与虚拟化平台动安装文件之前脚本先补两样系统级前提。在完整性检查环节它先逐行核对filelist.txt文件不齐就当场退出——半成品包不如不装。然后写入注册表开关。这是给 WSA 一把“免密钥匙”系统允许无开发者许可证时以开发模式注册 Appx 包没有它Add-AppxPackage -Register对 WSA 包会被直接拒掉reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock /t REG_DWORD /f /v AllowDevelopmentWithoutDevLicense /d 1另一样是 Virtual Machine Platform。WSA 的 Android 运行时跑在虚拟机里这个开关不开包能装上但起不来If ($(Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform).State -Ne Enabled) { Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName VirtualMachinePlatform Write-Warning Need restart to enable virtual machine platformrnPress y to restart or press any key to exit # ... 按 y 立即重启否则退出 }注意-NoRestart脚本不强制重启而是把决定权交给用户。不重启的话脚本直接 exit且重启后它不会自己接着跑——这是需要你手动再运行一次的点别以为按完 y 就万事大吉。依赖包安装比版本而不是盲装WSA 本体依赖几个 Appx 包。脚本不盲装而是读AppxManifest.xml里的PackageDependency清单逐个和系统已装版本比大小低于要求才装$Dependencies $Xml.Package.Dependencies.PackageDependency; $Dependencies | ForEach-Object { $InstalledVersion Get-InstalledDependencyVersion -Name $_.Name -ProcessorArchitecture $ProcessorArchitecture; If ($InstalledVersion -Lt $_.MinVersion) { Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Path $($_.Name)_$ProcessorArchitecture.appx } }版本对比时按ProcessorArchitecture过滤x64 机器只认 x64 包不会去动系统里恰好存在的 arm64 副本。代价是重复运行时几乎零开销——满足最低版本就打印一句 “Nothing to do” 跳过。Appx 注册真正让 WSA 跑起来的那一行命令前面所有准备都为这一行服务。注册之前脚本先拆两个障碍已装旧 WSA且非开发模式时提示手动卸载避免包名冲突再关掉正在运行的 WsaClient——被进程锁着的文件注册必失败If (Test-CommandExist WsaClient) { Start-Process WsaClient -Wait -Args /shutdown } Stop-Process -Name WsaClient -ErrorAction SilentlyContinue Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Register .\AppxManifest.xml-Register表示直接从本地清单文件注册整个包体已在磁盘上解压好不存在下载安装环节-ForceUpdateFromAnyVersion允许跨版本覆盖升级旧 WSA 时不会卡在版本号冲突上。装完它顺手做的事以及翻车时的退路成功后Finish函数清屏并用wsa://协议直接把 Magisk 和 Google Play 商店两个 App 打开——装完即验证用户不用自己找入口。若注册失败且系统里还有旧 WSA脚本不会报错了事用-PreserveApplicationData卸掉旧版本Android 应用数据保留再注册一次Remove-AppxPackage -PreserveApplicationData -Package $Installed.PackageFullName Add-AppxPackage -ForceApplicationShutdown -ForceUpdateFromAnyVersion -Register .\AppxManifest.xml这是脚本里唯一的“回滚”不恢复原状而是给用户第二次机会代价是开始菜单里的 Android 图标会暂时消失——错误提示里专门交代了这一点。 几个容易忽略的细节Windows Terminal 用户会掉坑。脚本发现自己在 Windows Terminal 里运行、且要装依赖包时会先清掉WT_SESSION环境变量然后整段自我重启到 conhost.exeIf ($env:WT_SESSION) { $env:WT_SESSION $null Start-Process conhost.exe -Args powershell.exe -ExecutionPolicy Bypass -Command Set-Location $PSScriptRoot; $PSCommandPath exit 1 }Appx 操作在 Windows Terminal 会话里可能被隔离机制卡住。与其让它失败到一半不如干脆换回传统控制台从头再来一次。MSIX 版 PowerShell 的 DISM 模块要特殊对待。如果 PowerShell 是从微软商店装的$PSHOME里会带8wekyb3d8bbwe字样此时Get-WindowsOptionalFeature直接不可用必须从 Windows PowerShell 显式导入 DISM 模块if ($PSHOME.contains(8wekyb3d8bbwe)) { Import-Module DISM -UseWindowsPowerShell }不处理这行紧接着的虚拟化检查会当场报错。判断依据就是路径字符串属于典型的“环境指纹”检测。MakePri 是一次性操作跑完就自我销毁。主脚本调用MakePri.ps1合并多语言资源否则 WSA 设置界面永远是英文而MakePri.ps1执行完会删掉自己、makepri.exe 和 pri/xml 目录并同步清理 filelist.txt。这就是主脚本只在这两个文件都存在时才调用它的原因——第二次运行时资源已经合并完毕这一步自动跳过。顺带一提MagiskOnWSA/installer/x64和 arm64 目录下的脚本变体与主脚本几乎逐行一致唯一差别是没有Check-Windows11判断只要 pwsh.exe 存在就优先使用。 你自己想动手验证的话用管理员权限的 PowerShell 跑下面几条就能复现脚本“看到”的系统状态。用Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform查 State不是 Enabled说明脚本会停在“按 y 重启”那一步。用reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock /v AllowDevelopmentWithoutDevLicense查注册表返回 0x1 表示免密钥匙已生效。用Get-AppxPackage | Where-Object Name -like *WindowsSubsystemForAndroid*查当前已注册的 WSA 包名和版本对照AppxManifest.xml里的Version字段。想看进程锁处理的话故意开着 WSA 窗口再跑一次脚本观察 “Shutting down WSA....” 出现后窗口自动关掉的整个过程。收尾这个脚本没什么玄学把 Windows 当成普通 Appx 宿主把预构建的 WSA 包当 Appx 应用装上其余全在为那一行注册命令上保险。仓库在 https://gitcode.com/GitHub_Trending/ws/WSABuilds clone 下来对着一读即知。【免费下载链接】WSABuildsRun Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU (root solutions) built in.项目地址: https://gitcode.com/GitHub_Trending/ws/WSABuilds创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考