2013-12-12 28 views
2

我使用的是WiX 3.6(但可以升級到3.8,如果需要的話)並且有一個用BURN編寫的引導程序,這幾乎是我所需要的,除了這一個問題;我似乎無法破解。WiX Burn - 基於條件設置InstallFolder變量

我有兩個變量; Product_XYZ和Product_ABC。第一個包含通過註冊表搜索填充的文件夾路徑(因此,如果搜索沒有找到我的reg鍵,它可能是空白的,另一個是硬編碼的(即「[ProgramFilesFolder] \ ABC」)。 (?)想要設置InstallFolder變量(以便它通過Options按鈕顯示在UI中)到Product_XYZ變量中的值(如果它不是空白的)。如果它是空白的,我想將InstallFolder設置爲Product_ABC中的值。

If Product_XYZ <> "" then 
    InstallFolder = [Product_XYZ] 
else 
    InstallFolder = [Product_ABC] 
endif 

但顯然使用燒傷邏輯!!

任何人都可以幫我嗎?

乾杯,

Chris。

+0

這可能有所幫助:http:// stackoverflow。com/questions/10501995/pass-parameters-from-bootstrapper-to-msi-bundle-package?lq = 1 – BryanJ

+0

感謝您的回覆,但唉,在這種情況下幫不了我。 –

回答

12

我有同樣的需求,並通過查看WiX的自己的包找到了解決辦法:

<Variable 
     Name='InstallFolder' 
     Type='string' 
     Value='[ProgramFilesFolder]WiX Toolset v$(var.WixMajorMinor)' /> 
    <util:RegistrySearch 
     Id="PreviousInstallFolderSearch" 
     Root='HKLM' 
     Key='SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)' 
     Value='InstallFolder' 
     Variable='PreviousInstallFolder' /> 
    <util:DirectorySearch 
     Path='[PreviousInstallFolder]' 
     Variable='InstallFolder' 
     After='PreviousInstallFolderSearch' 
     Condition='PreviousInstallFolder' /> 

<Variable/>元素定義的默認值。

<util:RegistrySearch/>查找註冊表值(如果找到,則將其保存在名爲​​的新變量中)。

僅當找到註冊表項時才執行<util:DirectorySearch/>。它會檢查該目錄是否存在,如果有,則設置InstallFolder

請注意,如果註冊表值存在,但它指定的目錄不存在,則將使用默認值。

+1

馬克,對不起,我從來沒有回答你的答案 - 那是因爲我從來不知道它在那裏(以爲我會收到來自這個網站的電子郵件?!)。今天,我正要發佈有關我的引導器的另一個問題,但是當我進入主題時,它提示我提出了這個我問過的老問題,那時候我注意到了你的答案。在閱讀之後,我認爲這是我原來所做的更好的解決方案;儘管我的解決方案有效,但我仍然嘗試過你的解決方案它確實在做事 - 但更好的是,它實際上解決了我即將要問的新問題!非常感謝! –

2
  1. 您應該測試您的MSI(不燃燒),如果你已經正確設置它,並安裝位置可以通過物業 根據您的目錄設置被改變,這僅僅是一個例子:

    <Directory Id="TARGETDIR" Name="SourceDir"> 
        <Directory Id="ProgramFilesFolder> 
         <Directory ID="INSTALLDIR" Name="FolderName" /> 
    ... 
    </Directory> 
    

    測試微星與MSIEXEC,例如:

    msiexec /i package.msi /qb+ INSTALLDIR="C:\Programs\ABC" 
    

    如果它不能在您指定那麼首先你需要修復您的維克斯MSI的安裝位置,使其可以接受INSTALLDIR。

  2. 在刻錄設置變量(InstallFolder)有條件後,您需要通過使用MsiProperty元素將其傳遞給MSIpackage。例如

    <MsiPackage Id="someid" Source="$(var.msi)Yourinstaller.msi"> 
        <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]" /> 
    

注意,當您發送INSTALLDIR屬性路徑微星它必須是完整路徑。