使用 DISM 管理 APPX 与 MSIX 包

前言

如果你的应用程序包名、或者文件路径中含有空格,请将空格改为连接符(-)或下划线(_)
Windows PE 4.0、Windows Server 2012 服务器核心安装选项或任何低于 Windows 8 和 Windows Server 2012 的 Windows 版本的 Windows 系统都不支持
如果仅有 /Image:<系统盘盘符>:/Online 参数,则代表另一个参数不可用

使用 PowerShell 管理 APPX 与 MSIX 包
关于参数

[/<参数>] 是可选的参数;[/<参数 1> | /<参数 2>] 是两个参数二选一,例如
- [/Image:<系统盘盘符>: | /Online] 代表这两个参数只能二选一,如果我选项前面的参数则就是 /Image:<系统盘盘符>:

{</参数>[</参数>] | </参数>[</参数>]} 代表花括号内参数二选一,中括号内参数可选

如果你是为挂载的映像添加,请将<系统盘盘符>:替换为挂载路径,如 C:\Temp\Mount(Windows 等文件夹的上层目录)

/Image: 参数仅允许在 PE 下使用,或对挂载的镜像使用;/Online 参数仅允许对当前正在运行的系统(联机映像)使用

/Get-Help /?

获取帮助
语法:

1
Dism /Image:<系统盘盘符>: /Add-ProvisionedAppxPackage /?
1
Dism /Online /Get-ProvisionedAppxPackages /?

/Get-Help /?

/Get-ProvisionedAppxPackages

获取映像中为每个用户安装的应用程序包的相关信息
语法:

1
Dism /Image:<系统盘盘符>: /Get-ProvisionedAppxPackages
1
Dism /Online /Get-ProvisionedAppxPackages

/Get-ProvisionedAppxPackages

/Add-ProvisionedAppxPackage

将一个或多个应用程序包添加到映像
若应用到未进入 OOBE 的系统或挂载的映像,每个现有的或新的用户配置文件都将注册该应用;如果将应用添加到联机映像,则在当前用户下次登录之前,将不会为此用户注册应用

若你使用的是 /Online 参数,且进入系统后不联网,则需要使用 /LicensePath 参数来指定许可证,否则可能会无法打开应用程序;如果为 UUP 集成的,可以在 UUP 的 UUPs\Apps 文件夹下找到 License.xml(可能不通用于不同软件间)

语法:

1
Dism /Add-ProvisionedAppxPackage {/FolderPath:<已解包的应用程序包路径> [/SkipLicense] | /PackagePath:<应用程序包路径> [/DependencyPackagePath:<应用程序包运行时路径>] [/LicensePath:<许可证路径> | /SkipLicense]}
其它参数及注解
  1. /CustomDataPath:<自定义数据文件路径> 可跟在 /FolderPath/PackagePath/SkipLicense/LicensePath 的参数后
  2. [/Region:"<区域>"] 可跟在 /FolderPath/PackagePath 的命令最末尾处
    • 使用 /Region 指定必须在其中预配应用包( .appx 或 .appxbundle)的区域。 区域参数可以是:
      · All,指示应为所有区域预配应用
      · 以分号分隔的区域列表, 区域将采用 ISO 3166-1 Alpha-2 或 ISO 3166-1 Alpha-3 代码形式; 例如,可以将美国指定为“US”或“USA”(不区分大小写),如果未指定区域列表,则只有在将包固定到“开始”菜单布局时,才会对其进行预配
  3. /DependencyPackagePath:<应用程序包运行时路径> 只能跟在 /PackagePath 的参数后,指定该应用程序包需要的应用程序包运行时,所需运行时在应用程序包内的 AppxManifest.xml 中列出,参数可叠加
  4. /LicensePath:<许可证路径> 可跟在 /FolderPath/PackagePath 的参数后,所需的许可证应为 .xml/SkipLicense 可跟在 /FolderPath/PackagePath 的参数后,在其它方案中使用可能会损坏映像

假如,我的系统盘盘符为 C,应用程序包放在 D:\Appx 下,应用程序包名为 Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx,没有许可证文件,则我的命令如下

1
Dism /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx /SkipLicense

抑或是

1
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx /SkipLicense

/Add-ProvisionedAppxPackage

其它示例

完整示例:

1
Dism /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /CustomDataPath:D:\Appx\CustomData\CustomData.xml /LicensePath:D:\Appx\License\License.xml /Region:"All"
1
Dism /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-1.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-2.appx /SkipLicense /Region:"US;GB"

/FolderPath:

1
Dism /Image:C: /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /CustomDataPath:D:\Appx\CustomData\CustomData.xml /LicensePath:D:\Appx\License\License.xml
1
Dism /Online /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /SkipLicense

/PackagePath:

1
Dism /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-1.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-2.appx /LicensePath:D:\Appx\License\License.xml
1
Dism /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /SkipLicense
1
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /Region:"All" /SkipLicense
1
Dism /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /LicensePath:D:\Appx\License\License.xml /Region:"US;GB"

/Remove-ProvisionedAppxPackage

从映像中删除应用程序包的预配,并不会注册到创建的新用户帐户
语法:

1
/Remove-ProvisionedAppxPackage /PackageName:<应用程序包全名称>

若我的应用程序包全名称为 Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbewe,则命令如下

1
Dism /Image:C: /Remove-ProvisionedAppxPackage /PackageName:Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe

抑或是

1
Dism /Online /Remove-ProvisionedAppxPackage /PackageName:Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe

/Remove-ProvisionedAppxPackage

在 PowerShell 中使用 Remove-AppxPackage 为已注册应用程序包的每个用户删除应用程序,以便从映像中完全删除该应用程序
如果尚未将应用程序包注册到任何用户配置文件,则 /Remove-ProvisionedAppxPackage 选项将完全删除应用程序包,而非仅删除预配

疑难解答

如果遇到 错误: 0xc1570118 的报错,则可能是由于目标应用程序包已安装导致

0xc1570118

参考文献

  1. Microsoft Learn