You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于编写Windows 10无人值守升级至Windows 11脚本并剔除冗余应用的技术问询

编写Windows 10无人值守升级至Windows 11脚本并剔除冗余应用的实操方案

嘿,刚好我之前帮企业批量处理过类似的需求——既要无人值守升级Windows 10到11,又要把Xbox、纸牌这类用不上的预装应用通通去掉,给你一套实操性拉满的方案:

一、先预处理Windows 11镜像:从根源剔除冗余应用

Windows 11的预装应用是通过「Provisioned Apps」机制存在的,升级时会自动部署到系统里,所以最彻底的办法是先修改安装镜像,把不需要的应用删掉再升级。

步骤如下:

  1. 用Windows 11媒体创建工具导出ISO镜像(命令行批量生成更高效):
MediaCreationToolW11.exe /Eula Accept /Retail /MediaLangCode en-US /MediaArch x64 /MediaEdition Professional /CreateMedia /ISO
  1. 挂载ISO镜像到本地盘符(比如D:),然后创建镜像挂载目录:
mkdir C:\Mount\W11
  1. 挂载镜像里的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
  1. 列出所有预装的Provisioned Apps,找到你要移除的目标(比如Xbox相关的包):
Dism /Image:C:\Mount\W11 /Get-ProvisionedAppxPackages
  1. 批量移除冗余应用(用通配符匹配更方便,可按需添加其他应用):
# 移除所有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*
  1. 提交镜像修改并卸载挂载:
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

火山引擎 最新活动