在 WiX 3.7 中结合绝对路径和相对路径

Posted

技术标签:

【中文标题】在 WiX 3.7 中结合绝对路径和相对路径【英文标题】:Combining an absolute path with a relative path in WiX 3.7 【发布时间】: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"

我对@9​​87654327@ 的东西不太熟悉。我看到了几个$path::combine() 的例子,所以我想我认为这可以在.NET 中使用getfullpath。也许确实如此,但我的语法是错误的?

谢谢!

编辑:抱歉,我从BUILDING WIX 得到了$path::combine... 的东西,但没有完全阅读那篇文章的内容。它与 wxs 文件无关,它用于 NAnt(如下所述的 Rob)。所以我想我的问题很简单:如何组合和解析像C:\Program files (X86)\MyApp ID\MyAppLauncher\..\MyApp 这样的绝对路径和相对路径。谢谢

EDIT2:再次感谢 Rob,我非常专注于解决我什至没有考虑过最明显解决方案的路径,即简单地引用一个新的 &lt;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>

【问题讨论】:

【参考方案1】:

RegistryValue/@Value 中的语法看起来像 NAnt 之类的。目前尚不清楚是什么解释,但 Windows 安装程序不会。您有几个选项可以使该注册表值正确。首先,将RegistryValue 元素更改为如下所示:

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

或者,您可以在目录树中定义“MyApp”并直接引用它。这看起来有点像添加以下内容作为MyAppBaseFolderINSTALLFOLDER 的同级)的孩子:

 <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" />

我更喜欢后者,但这只是因为我更喜欢使用不连接字符串的标识符。

【讨论】:

非常感谢(再次)Rob!当你写你的答案时,我只是在更新我的帖子。确实是 NAnt。我想在将随机代码粘贴到我的 XML 中之前,我应该更仔细地阅读这些文章 :)。我现在就试试你的建议。

以上是关于在 WiX 3.7 中结合绝对路径和相对路径的主要内容,如果未能解决你的问题,请参考以下文章

ReferenceError: $ is not defined (绝对路径和相对路径)

绝对路径和相对路径,目录命令(cd,mkdir,rm,history)

wpf image控件 绑定本地磁盘的图片 绝对路径的应该怎么写

相对路径和绝对路径的区别是啥?

C# 相对路径转换成绝对路径。

在asp.net中,加载图片的相对路径和绝对路径分别用啥