正文

在工作中,曾经遇到过一个问题。

有一个 component,名字叫做 Oxford Adaptive Learning Dictionary,是一款牛津词典的应用。这个 component,需要安装在 Windows 10 的系统上。这个应用属于 UWP 应用,用行话来讲,叫做 Modern App。Modern App 是区别于 Win32 App 的一种应用(按照我的理解,在 Win8 和 Win8.1 之后,才有了 “应用” 这一说法,在这之前,我们都把他们叫做 “软件”),它采用的是 沙盒机制,其程序文件是无法访问的(使用管理员账户也无法访问)。要打开这一应用,只有通过开始菜单的 All App 中的图标;要卸载这一应用,可以通过在 All App 中邮件选择卸载,或者在 Apps & Features 中,找到这一应用以后选择卸载。(Win32 程序的卸载方式可以通过 Program and Features,Modern App 不会在其中出现)

背景介绍完了以后,我来描述一下所遇到的问题。Oxford Dictionary 的安装文件的后缀名是 appxbundle,通过 dism /online /Add-ProvisionedAppxPackage 命令来安装。在 dism 的命令显示 “操作成功完成” 之后,发现在 All Apps 里面有了 Oxford Dictionary 的图标,但是在 Apps & Features 里面却没有发现 Oxford 这一项。这点十分蹊跷,看起来像是 Oxford 没有成功安装。
在 All Apps 里面点击 Oxford,发现应用的图标下面出现了类似进度条的物件,Oxford 词典无论如何都无法启动。问题出现了:Oxford Dictionary 无法安装!
但是,dism /online /Add-ProvisionedAppxPackage 不是显示 “操作成功完成” 了吗?于是,试图从 dism 的 log 中寻找原因。
dism.log 的路径是 C:\Windows\Logs\DISM\dism.log。打开这个日志后,发现所有的命令的执行结果都是 Info 或者 Warning 类型,没有 Error;而且 dism.log 也显示 Add-ProvisionedAppxPackage 命令成功完成。这条路被堵死了。

休息一下以后,回来再次思考这个问题。可以确定的是,Oxford Dictionary 一定没有安装成功,因为如果安装成功,那么一定可以启动这个应用。但是 dism.log 显示命令的执行是成功的。于是 debug 的思路是:能否找到比 dism.log 更详细的安装日志?

于是我请教了某一位同事,在他的帮助下,成功解决了这一问题!以下是解决步骤。

第一步,找到 “事件查看器” Event Viewer,保存 “Windows 日志” 下面的条目,例如:应用程序、系统等等。将这些日志保存下来,是为了做比较。所以,在安装 Oxford 之前,保存一次;在安装 Oxford 之后,再保存一次。这样就可以比较前后两次日志的不同之处了。

后来知道,其实,像 Oxford 之类的应用的安装日志在 系统 日志中。

第二步,使用 Beyond Compare,比较前后日志的不同。可以查找关键字如 “Oxford” 或者其他相关的关键字。

如下图所示,发现了不同之处。在 C:\Windows\Temp\AppXDeploymentServer_E33F44D0-B47D-0001-276B-3FE37DB4D101.evtx 中记录了与 Oxford 安装相关的日志。由此顺藤摸瓜,继续寻找原因。

第三步,根据进一步的分析,事件查看器中类似 Oxford 的安装日志的位置是 C:\Windows\System32\winevt\Logs\Microsoft-Windows-AppXDeploymentServer%4Operational.evtx,当然也可以直接在事件查看器的 Windows 日志下点击 系统 来查看。如下图所示是直接打开日志文件并且搜索 Oxford 的结果,这就是 比 dism.log 更详细的安装日志!

出错原因分析:其实出错原因很简单,在安装 Oxford Dictionary 时,需要指定 DependencyPackagePath。如果没有指定,而且目标机器上没有依赖的库文件的话,安装就会失败。这也解释了为什么在某些 Win10 机器上可以安装,而某些机器不可以。

完整的 Oxford Dictionary 安装命令,如下所示:

dism.exe /online /Add-ProvisionedAppxPackage /PackagePath:"c:\OxfordUniversityPressh.4488779F267

小结

通过这次问题解决的过程,知道 Windows 10 或者 Windows 8.1 的系统,使用 dism /online /Add-ProvisionedAppxPackage 命令会在 C:\Windows\Logs\DISM\dism.log 中生成日志。并且,更详细的日志,可以通过 事件管理器->Windows 日志->系统 来查看,或者打开 C:\Windows\System32\winevt\Logs\Microsoft-Windows-AppXDeploymentServer%4Operational.evtx 来查看。

后记

当时我去请教的同事,我们可以叫他 Robell。他对 dism,PowerShell,DOS Script,VB Script 等有比较深的造诣。在这之后不久,他离开了 HP。写这篇文章,也是为了顺便纪念他。^^

创作日期:7/29/2016 11:18:38 AM

如何获取比 dism.log 更详细的日志的更多相关文章

  1. 获取Tomcat更详细的日志

    前言 有时候tomcat报错未详细,未能定位到原因. 解决方法: 获取更详细的日志,以便调试. 详细步骤:   获取详细的日志,方法如下: 在WEB-INF/classes目录下logging.pro ...

  2. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  3. 获取异常具体信息 尤其是运行时异常例如NullPointerException 比e.getMessage()更详细

    ///打印异常信息 尤其是运行时异常 比getMessage()更详细public static String getMessageInfo(Exception e){ OutputStream op ...

  4. python3获取指定目录内容的详细信息

    不同平台获取指定目录内容的详细信息命令各不相同: Linux中可以通过ls -al获取获取 windows中可以通过dir命令获取 下面是我写的一个通用获取目录内容详细信息的python3脚本: #! ...

  5. Nginx配置中的log_format用法梳理(设置详细的日志格式)

    nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式:另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,可以参加ngx_http_log_mo ...

  6. Linux /var/log下的各种日志文件详解

    1)/var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. 2)/var/log/wtmp:记录登录这的信息记录,被编码过,所以必须以 ...

  7. aliyun 日志服务(Log Service,Log)是针对日志场景的一站式服务

    日志服务(Log Service,Log)是针对日志场景的一站式服务,在阿里巴巴集团内部被广泛使用.用户无需开发就能快捷完成日志生命周期中采集.消费.投递以及查询功能. 日志服务当前提供如下功能 日志 ...

  8. Docker 1.13.0 详细更新日志

    本文讲的是Docker 1.13.0 详细更新日志[编者的话]Docker发布1.13.0版本,此次版本更新内容较多,以下为该版本具体的变更. 构建 添加在构建时可以指定镜像用作高速缓存源的功能. 这 ...

  9. SQLServer2005删除log文件和清空日志的方案

    数据库在使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间.SQL Server数据库都有log文件,log文件记录用户对数据库修改的操作.可以通过直接删除log文件和清空日 ...

随机推荐

  1. linux查看cpu核数和内存指令

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  2. Java利用反射排序

    前言 Java为我们提供了几种排序得方法,比如Arrays和Collections类,但是前提是数组或者集合中的元素都必须实现Comparable接口,基本的数据类型都已经实现了Comparable接 ...

  3. Java中的static(1)【持续更新】——关于Eclipse的No enclosing instance of type ... 错误的理解和改正

    No enclosing instance of type SomeClass is accessible. Must qualify the allocation with an enclosing ...

  4. Shiro集成SSM基于URL权限管理(一)

    学习了shiro之后,我们就可以说尝试把shiro加入ssm中,并做一套基于URL的权限管理. 其他的准备工作就不多说了,直接动手操作,看到效果再去理解. 表结构 执行如下,数据库名字可以自行修改,不 ...

  5. 【Java】 生成32位随机字符编号

    /** * 生成32位编码 * @return string */ public static String getUUID(){ String uuid = UUID.randomUUID().to ...

  6. LitePal的聚合函数

    传统的聚合函数用法   虽说是聚合函数,但它的用法其实和传统的查询还是差不多的,即仍然使用的是select语句.但是在select语句当中我们通常不会再去指定列名,而是将需要统计的列名传入到聚合函数当 ...

  7. Zabbix监控方案-官方最新4.4版本

    Zabbix 2019/10/12 Chenxin 参考 https://www.zabbix.com/documentation/4.0/zh/manual https://baike.baidu. ...

  8. 新手学分布式-动态修改Nginx配置的一些想法

    本人是分布式的新手,在实际工作中遇到了需要动态修改nginx的需求,因此写下实现过程中的想法.Nginx功能强大且灵活,所以这些权当抛砖引玉,希望可以得到大家的讨论和指点.(具体代码在 https:/ ...

  9. Jenkins 管道 工作流 自动化部署

    jenkins Jenkins是一个用Java编写的开源的持续集成工具.在与Oracle发生争执后,项目从Hudson项目复刻. Jenkins提供了软件开发的持续集成服务.它运行在Servlet容器 ...

  10. Vue入门教程 第三篇 (条件与循环)

    v-if语法(条件) 符合条件时显示(渲染)某一元素. <div id="app"> <div v-if="ok"> <h1> ...