2012-01-11 65 views
0

基本上我試圖構建一個可以運行devcon.exe(Windows硬件管理器的命令行版本)來檢測是否安裝了特定硬件的WIX msi。如果是,則安裝msi A,否則安裝msi B(A和B已作爲獨立的msi軟件包存在,我們需要基於硬件自動選擇性安裝)。試圖從WIX msi運行嵌入式工具進行選擇性安裝

目前我已經安裝了WIX SDK,並創建了一個WIX項目,可以正確構建一個msi。我可以做簡單的事情,比如執行CustomActions來打開notepad.exe,這種簡單的事情。

第一個問題:我無法找到如何將文件打包到不會安裝到目錄中的安裝程序中。我找到了它的參考,但沒有明確說明如何去做。如果它不會被安裝到主機驅動器中,我不必將其放入'Directory'標籤內,對嗎?

第二個問題:devcon.exe沒有(從我能說的,糾正我,如果我錯了)似乎改變它的返回值取決於它發現,可能是因爲它做了很多事情,並不是'不限制硬件設備是否存在。因此,如果我可以將它嵌入並讓它運行,那麼我需要以某種方式將它輸出到標準輸出流,然後解析它以獲得我正在尋找的特定值。

當然,它會更容易一些,因爲我已經有一個批處理文件,可以解析並設置一個環境變量,告訴我我需要知道什麼,但是,如果我可以嵌入它們兩個,我如何讓批處理文件引用嵌入的devcon.exe,然後讓WIX讀取變量,或者我可以在WIX​​中設置一個(或一個屬性),然後從批處理文件中設置它?

也許我應該創建一個DLL自定義操作?是否有可能從dll自定義操作運行嵌入式可執行文件?然後我可以運行devcon.exe,並在那裏進行所有解析,然後設置一個Wix變量或Property來選擇接下來要做的事情。

第三個問題:能夠從另一個msi運行一個msi。我還沒有做到這一點,但我發現(http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html)看起來很有前途,儘管我還沒有完全讀過它然而。在時間的一個問題,我當然有足夠的已經:)

回答

0

好了,第一個問題就解決了:

<Binary Id="Devcon" SourceFile="D:\Programming\Device_Selection\Device_Selection\devcon.exe"/> 
<CustomAction Id="RunDevcon" BinaryKey="Devcon" ExeCommand="resources *vendor*device*" Return="check" Execute="deferred" Impersonate="no" /> 

這確保了Devcon.exe的工具嵌入安裝,我也可以以管理員模式運行它(除非您指定Impersonate爲「否」並且執行爲「deferred」),否則無法運行。

我需要做的下一件事是能夠讀取devcon通常發送到控制檯(即。cmd窗口)的輸出,然後解析它以獲取信息。有沒有辦法捕捉輸出?

0

對於第二個問題,我會創建一個EXE或DLL自定義操作,啓動devcon.exe,讀取其輸出並解析它。 devcon.exe本身可以存儲在EXE/DLL的資源中,並在啓動之前提取到臨時目錄中,然後在完成後將其刪除。

如果您選擇DLL,您可以更改MSI公共屬性。這樣你就可以設置一個屬性來控制MSI下一步將要做的事情。

如果您選擇EXE,您擁有的只是退出代碼。據我所知,MSI實際上並沒有太多可以做的事情。


鏈接MSI安裝不推薦使用。您可以將兩個驅動程序嵌入到一個軟件包中,並根據devcon.exe檢測結果設置的屬性選擇要安裝的組件。


另一種方法是創建一個引導程序EXE,它運行devcon.exe並確定要安裝哪個軟件包。然後它只需安裝正確的MSI軟件包。