2016-04-29 96 views
1

我有這樣的特性:維克斯維修安裝在默認路徑,而不是在那裏安裝該應用程序

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER"/> 

我的目錄:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="LocalAppDataFolder"> 
    <Directory Id="LocalAppDataCompany" Name="Company"> 
     <Directory Id="INSTALLFOLDER" Name="Product" /> 
    </Directory> 
    </Directory> 
</Directory> 

它編譯成功。當我運行.msi時,它會按預期方式安裝C:\Users\[CurrentUser]\AppData\Local\Company\Product中的文件。

但問題是:

  1. 我運行安裝程序,並更改路徑(讓我們在對話中說,我改變了路徑Product2
  2. 該產品安裝在...\AppData\Local\Company\Product2成功
  3. 我再次運行安裝程序,並選擇修復
  4. 現在我有2個產品實例:

C:\Users\[CurrentUser]\AppData\Local\Company\Product C:\Users\[CurrentUser]\AppData\Local\Company\Product2

如何解決的修復,在重新安裝的文件(維修期間)的...\AppData\Local\Company\Product2(或任何應用程序是最初安裝的)?

我試過使用註冊表搜索(因爲我在註冊表中保存了INSTALLFOLDER的值),但它不起作用。

+0

你可以在問題中分享你的RegistrySearch和RegistryValue組件嗎?這是做這件事的方式,所以我會懷疑某件作品是不正確的。 –

回答

1

編輯:哇我真的需要在回答前閱讀完整問題。剛注意到你正在將這個值存儲在註冊表中。儘管如此,我仍然會留下我的答案,因爲它可能有用。


你需要實現一個記得我圖案讓你的安裝可以在初始安裝過程中已被修改,即可拾取性。安裝目錄可能是您應該記住的最經常修改的屬性。有很多安裝程序不這樣做,你會注意到,如果你正在升級,他們總是默認爲默認的安裝目錄,而不是你之前安裝的可能會令人討厭的地方。

This很好地解釋了「記住我」模式的概念。在大多數情況下,您可以簡單實施。

要點是,您需要存儲更改後的安裝目錄(通常位於註冊表中)的值,然後在每次隨後運行安裝程序時嘗試將其提取出來。

對於INSTALLFOLDER屬性,您只需添加兩件東西,一個註冊表搜索和一個註冊表項。

首先我們需要添加一個新的組件用的RegistryKey到INSTALLFOLDER的值寫入註冊表

<Component Id="InstallFolderRegistry" Directory='INSTALLFOLDER'> 
    <RegistryValue Root='HKCU' Key='SOFTWARE\[Manufacturer]\[ProductName]' 
       Name='InstallFolder' Value='[INSTALLFOLDER]' 
       Type='string' KeyPath="yes" />  
</Component> 

您也可以搭載此註冊表值到另一個組件,如果你真希望刪除「的keyPath =」是「」。

這會在安裝期間將INSTALLFOLDER屬性的值放入註冊表中。

現在我們需要嘗試讀取該值,如果它在啓動時存在,以便在升級或修理期間我們將得到用戶選擇安裝的正確位置。

<Property Id='INSTALLFOLDER'> 
    <RegistrySearch Id='InstallFolderRegSearch' Root='HKCU' 
        Key='SOFTWARE\[Manufacturer]\[ProductName]' 
        Name='InstallFolder' Type='raw' /> 
</Property> 

現在,當你修復安裝程序時,應該找到這個註冊表項,然後修復正確的目錄。在升級過程中,安裝位置將被設置爲與當前安裝的產品相同的位置。

要注意,如果您有非靜態的ProductName或Manufacturer,則只需在註冊表路徑中輸入靜態文本而不是「[Manufacturer]」和「[ProductName]」即可。

+0

感謝您的回答。我會嘗試一下,當我使用註冊表記住我的模式時,我可能錯過了一些東西:) – KaeL