【发布时间】:2013-04-26 19:57:01
【问题描述】:
我正在尝试使用 RemoveFolderEx 在卸载应用程序时从我的安装文件夹中删除上一级的文件夹。这是我所拥有的,但它不起作用:
<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>
MSI 可以正常构建,但是当我运行设置时,它似乎在 RegistryValue 元素上失败并抱怨路径中的“..”。我正在制作的字符串如下:"C:\Program Files (X86)\MyApp ID\MyAppLauncher\..\MyApp"。我需要将其解析为:"C:\Program Files (X86)\MyApp ID\MyApp"。
我对@987654327@ 的东西不太熟悉。我看到了几个${path::combine()} 的例子,所以我想我认为这可以在.NET 中使用getfullpath。也许确实如此,但我的语法是错误的?
谢谢!
编辑:抱歉,我从BUILDING WIX 得到了${path::combine... 的东西,但没有完全阅读那篇文章的内容。它与 wxs 文件无关,它用于 NAnt(如下所述的 Rob)。所以我想我的问题很简单:如何组合和解析像C:\Program files (X86)\MyApp ID\MyAppLauncher\..\MyApp 这样的绝对路径和相对路径。谢谢
EDIT2:再次感谢 Rob,我非常专注于解决我什至没有考虑过最明显解决方案的路径,即简单地引用一个新的 <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>
【问题讨论】: