关于编写Windows 10无人值守升级至Windows 11脚本并剔除冗余应用的技术问询
编写Windows 10无人值守升级至Windows 11脚本并剔除冗余应用的实操方案
嘿,刚好我之前帮企业批量处理过类似的需求——既要无人值守升级Windows 10到11,又要把Xbox、纸牌这类用不上的预装应用通通去掉,给你一套实操性拉满的方案:
一、先预处理Windows 11镜像:从根源剔除冗余应用
Windows 11的预装应用是通过「Provisioned Apps」机制存在的,升级时会自动部署到系统里,所以最彻底的办法是先修改安装镜像,把不需要的应用删掉再升级。
步骤如下:
- 用Windows 11媒体创建工具导出ISO镜像(命令行批量生成更高效):
MediaCreationToolW11.exe /Eula Accept /Retail /MediaLangCode en-US /MediaArch x64 /MediaEdition Professional /CreateMedia /ISO
- 挂载ISO镜像到本地盘符(比如
D:),然后创建镜像挂载目录:
mkdir C:\Mount\W11
- 挂载镜像里的install.wim文件(先查清楚对应版本的索引,一般专业版是索引1):
# 先查看镜像索引 Dism /Get-ImageInfo /ImageFile:D:\sources\install.wim # 挂载指定索引的镜像 Dism /Mount-Image /ImageFile:D:\sources\install.wim /Index:1 /MountDir:C:\Mount\W11
- 列出所有预装的Provisioned Apps,找到你要移除的目标(比如Xbox相关的包):
Dism /Image:C:\Mount\W11 /Get-ProvisionedAppxPackages
- 批量移除冗余应用(用通配符匹配更方便,可按需添加其他应用):
# 移除所有Xbox相关应用 Dism /Image:C:\Mount\W11 /Remove-ProvisionedAppxPackage /PackageName:*Xbox* # 可追加其他冗余应用,比如: # Dism /Image:C:\Mount\W11 /Remove-ProvisionedAppxPackage /PackageName:*ZuneMusic* # Dism /Image:C:\Mount\W11 /Remove-ProvisionedAppxPackage /PackageName:*MicrosoftSolitaireCollection*
- 提交镜像修改并卸载挂载:
Dism /Unmount-Image /MountDir:C:\Mount\W11 /Commit
二、编写无人值守升级脚本:全程无交互
接下来写一个升级脚本,调用预处理后的镜像,配合无人应答文件实现全自动升级。
1. 硬件预检脚本(PowerShell)
升级前先检查目标机器是否满足Windows 11的硬件要求(TPM 2.0、Secure Boot),避免升级失败:
# 检查TPM 2.0状态 $tpmStatus = Get-Tpm if (-not $tpmStatus.TpmPresent -or -not $tpmStatus.TpmEnabled) { Write-Host "ERROR: 该设备未启用或不存在TPM 2.0,无法升级Windows 11" exit 1 } # 检查Secure Boot状态 $secureBootStatus = Confirm-SecureBootUEFI if (-not $secureBootStatus) { Write-Host "ERROR: 该设备未启用Secure Boot,无法升级Windows 11" exit 1 } Write-Host "硬件检查通过,开始升级..."
2. 升级执行脚本(批处理)
把预检脚本和升级命令整合,调用setup.exe并指定无人应答文件:
@echo off setlocal enabledelayedexpansion # 先运行硬件预检 powershell -ExecutionPolicy Bypass -File "C:\Scripts\CheckW11Requirements.ps1" if %errorlevel% neq 0 exit /b %errorlevel% # 配置路径(替换成你自己的镜像和应答文件路径) set "ISO_MOUNT_PATH=D:\" set "UNATTEND_FILE=C:\Scripts\unattend.xml" # 启动无人值守升级,禁用动态更新避免重新下载冗余内容 "%ISO_MOUNT_PATH%\setup.exe" /auto upgrade /unattend:%UNATTEND_FILE% /dynamicupdate disable
3. 无人应答文件(unattend.xml)核心配置
这个文件用来跳过OOBE阶段的所有交互步骤,确保全程无人干预,以下是简化版的关键配置(按需补充其他设置):
<?xml version="1.0" encoding="utf-8"?> <unattend xmlns="urn:schemas-microsoft-com:unattend"> <!-- 个性化系统配置 --> <settings pass="specialize"> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <ComputerName>*</ComputerName> <!-- 自动生成计算机名 --> <CopyProfile>true</CopyProfile> <!-- 保留原系统用户配置 --> </component> </settings> <!-- 跳过OOBE交互步骤 --> <settings pass="oobeSystem"> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <OOBE> <HideEULAPage>true</HideEULAPage> <!-- 跳过许可协议 --> <HideLocalAccountScreen>true</HideLocalAccountScreen> <!-- 跳过本地账户创建(如果用域账户可调整) --> <HideOnlineAccountScreens>true</HideOnlineAccountScreens> <!-- 跳过微软账户登录 --> <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> <!-- 跳过无线配置 --> <NetworkLocation>Work</NetworkLocation> <!-- 设置网络位置为工作网络 --> <ProtectYourPC>1</ProtectYourPC> <!-- 禁用自动开启的隐私选项 --> </OOBE> </component> </settings> </unattend>
三、升级后兜底清理(可选)
如果预处理时漏了某些应用,或者升级后又自动安装了冗余内容,可以在无人应答文件里添加「首次登录命令」,自动运行清理脚本:
# 移除当前用户的冗余应用 Get-AppxPackage *Xbox* | Remove-AppxPackage # 移除所有用户的冗余应用(需管理员权限) Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like "*Xbox*" | Remove-AppxProvisionedPackage -Online
把这段代码保存为CleanupApps.ps1,然后在unattend.xml的oobeSystem阶段添加:
<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <CommandLine>powershell -ExecutionPolicy Bypass -File "C:\Scripts\CleanupApps.ps1"</CommandLine> <Order>1</Order> <Description>清理冗余预装应用</Description> </SynchronousCommand> </FirstLogonCommands>
四、几个关键注意事项
- 确保脚本和镜像文件都放在本地可访问的路径,避免网络问题导致升级中断;
- 运行脚本需要管理员权限,可通过组策略或任务计划批量推送;
- 测试时先在一台机器上验证,没问题再批量部署。
备注:内容来源于stack exchange,提问作者Luis Gonzalez




