2013-04-26 54 views
3

我試圖在卸載應用程序時使用RemoveFolderEx從安裝文件夾中刪除一個級別的文件夾。這裏是我有什麼,但它不工作:將絕對路徑與WiX中的相對路徑相結合3.7

<Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="MyAppBaseFolder" Name="MyAppID"> 
      <Directory Id="INSTALLFOLDER" Name="MyAppLauncher"> 
      <Directory Id="UPDATESCRIPTSFOLDER" Name="Scripts" /> 
      <Component Id="CleanupMainApplicationFolder" Guid="*"> 
       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Name="Path" Type="string" Value="${path::getfullpath(path::combine([INSTALLFOLDER],'..\MyApp'))}" KeyPath="yes" /> 
       <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 
      </Component> 
      </Directory> 
     </Directory> 
     </Directory> 
     <Directory Id="ProgramMenuFolder"> 
     <Directory Id="ApplicationProgramsFolder" Name="MyApp ID"/> 
     </Directory> 
    </Directory> 
    </Fragment> 

微星將建設很好,但是當我運行安裝它似乎是失敗的RegistryValue元素和路徑抱怨「..」 。我正在製作的字符串如下:"C:\Program Files (X86)\MyApp ID\MyAppLauncher\..\MyApp"。我需要它來解決:"C:\Program Files (X86)\MyApp ID\MyApp"。我不太熟悉${path:: ... }的東西。我看到${path::combine()}的幾個例子,所以我想我會認爲這將在.NET中使用getfullpath。也許它確實存在,我的語法錯了?

謝謝!

編輯:對不起,我得到了${path::combine...東西從BUILDING WIX沒有完全閱讀那篇文章正在做什麼。它與wxs文件無關,它是針對NAnt的(正如Rob所述)。所以我想我的問題只是這樣的:我怎樣才能組合和解決絕對和相對的路徑,如C:\Program files (X86)\MyApp ID\MyAppLauncher\..\MyApp。謝謝

編輯2:再次感謝羅布,我非常關注解決路徑,我甚至沒有考慮最明顯的解決方案,它只是簡單地引用一個新的<Directory元素。我現在把它清理2個文件夾下面的代碼:

<Property Id="APPLICATIONFOLDER"> 
    <RegistrySearch Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" /> 
    </Property> 

    <Property Id="PRINTERFOLDER"> 
    <RegistrySearch Key="SOFTWARE\MyApp ID\MyApp ID Printer" Root="HKLM" Type="raw" Id="PRINTERFOLDER_REGSEARCH" Name="Path" /> 
    </Property> 

...

<Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="MyAppBaseFolder" Name="MyAppID"> 
      <Directory Id="INSTALLFOLDER" Name="MyAppLauncher"> 
      <Directory Id="UPDATESCRIPTSFOLDER" Name="Scripts" /> 
      <Component Id="CleanupMainApplicationFolder" Guid="*"> 
       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" Name="Path" Type="string" Value="[LM_INSTALLFOLDER]" KeyPath="yes" /> 
       <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 

       <RegistryValue Root="HKLM" Key="SOFTWARE\MyApp ID\MyApp ID Printer" Name="Path" Type="string" Value="[LMP_INSTALLFOLDER]" /> 
       <util:RemoveFolderEx On="uninstall" Property="PRINTERFOLDER" /> 
      </Component> 
      </Directory> 
      <Directory Id="LM_INSTALLFOLDER" Name="MyApp" > 
      </Directory> 
      <Directory Id="LMP_INSTALLFOLDER" Name="MyAppPrinter" > 
      </Directory> 
     </Directory> 
     </Directory> 
     <Directory Id="ProgramMenuFolder"> 
     <Directory Id="ApplicationProgramsFolder" Name="MyApp ID"/> 
     </Directory> 
    </Directory> 
    </Fragment> 

回答

3

您在RegistryValue/@Value有語法看起來像楠什麼的。目前還不清楚是什麼解釋,但Windows Installer不會。您有幾個選項可以正確獲取該註冊表值。首先,改變RegistryValue元素看起來像:

<RegistryValue Root="HKLM" 
       Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" 
       Name="Path" 
       Type="string" 
       Value="[MyAppBaseFolder]MyApp" 
       KeyPath="yes" /> 

或者,你可以在你的目錄樹定義「MyApp的」直接引用它。這會看起來有點像添加以下爲MyAppBaseFolder一個孩子(的INSTALLFOLDER同行):

<Directory Id='MyAppFolder' Name='MyApp' /> 

然後更新您的RegistryValue元素看起來像:

<RegistryValue Root="HKLM" 
       Key="SOFTWARE\MyApp ID\MyApp ID Windows Client" 
       Name="Path" 
       Type="string" 
       Value="[MyAppFolder]" 
       KeyPath="yes" /> 

我更喜歡後者,但是這只是因爲我更喜歡使用標識符而不用連接字符串。

+0

非常感謝(再次)羅布!當你寫答案時,我只是更新我的帖子。的確是NAnt。我想我應該先閱讀這些文章,然後再將隨機代碼粘貼到我的XML中:)。我現在要嘗試你的建議。 – 2013-04-26 21:06:34