正文
在工作中,曾經遇到過一個問題。
有一個 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