使用相对路径在 WiX 安装程序中创建符号 link

Creating a symbolic link in a WiX installer using relative paths

我一直在尝试做一些类似 here 发布的关于在 WiX 安装程序中创建符号 link 的事情。它解释了如何制作一个可以制作符号 link 的附加组件。然而,这不是我想要的。我正在尝试使用像这样的剪辑

<CustomAction Id="MakeSymbolicLink" 
   Directory="TARGETDIR" 
   ExeCommand="cmd /c mklink .\linkToItem.lnk '%CommonProgramFiles(x86)%\Additional Folders\myexecutable.exe'"  /> 

我已经尝试使用 cmd.exe 而不是 cmd 来执行此操作,但没有成功。

然后我会这样调用自定义操作:

    <Custom Action="MakeSymbolicLink" After="InstallFinalize" />

我在 InstallFinalize 之前也试过调用它,我得到了同样的行为。

我的目标是通过此设置创建符号 link。 我拥有的另一个解决方案是能够创建快捷方式,但是除了开始菜单或桌面

当我 运行 添加这些行后安装程序无法执行它们。如果没有调用 Symbolic link 自定义操作,我可以让安装程序成功完成。

最终目标是从通用文件可执行文件中获取符号 link 到应用程序的安装位置。

更新

我让 Symbolic link 工作更改自定义操作现在看起来像:

<CustomAction Id="MakeSymbolicLink" 
   Directory="TARGETDIR" 
   ExeCommand='cmd /c mklink .\linkToItem.lnk "%CommonProgramFiles(x86)%\Additional Folders\myexecutable.exe"' 
   Execute="deferred"
   Impersonate="no"/> 

并像这样调用自定义操作:

    <Custom Action="MakeSymbolicLink" Before="InstallFinalize" />

但现在当我 运行 卸载时,我收到以下错误消息:There is a problem with this windows installer package. a program run as part of the setup did not finish as expected contact your support personnel or package vendor.

如果您使用类似这样的内容作为您的客户操作:

<CustomAction Id="MakeSymbolicLink" 
   Directory="TARGETDIR" 
   ExeCommand='cmd /c mklink .\linkToItem.lnk "%CommonProgramFiles(x86)%\Additional Folders\myexecutable.exe"' 
   Execute="deferred"
   Impersonate="no"/>

在您的 InstallExecuteSequence 中需要:

<Custom Action="MakeSymbolicLink" Before="InstallFinalize">NOT Installed</Custom>

如果您想在重新安装或其他选项时执行此操作,这将确保仅在安装您的应用程序时执行此操作,您可能需要进一步研究如何执行此操作

如果确保在用户卸载应用程序后留下零足迹,您将需要在之后删除符号 link。 我通过执行以下操作解决了这个问题:

首先我创建了另一个CustomAction

<CustomAction Id="RemoveSymbolicLink" 
   Directory="TARGETDIR" 
   ExeCommand='cmd /c DEL .\linkToItem.lnk ' 
   Execute="deferred"
   Impersonate="no"/>

然后我需要另一个 InstallExecuteSequence 来执行它。但是我只需要在卸载时 运行 这个,所以它需要一个不同的条件来做到这一点,所以这个看起来像:

<Custom Action="RemoveSymbolicLink" After="InstallInitialize">Installed AND NOT REINSTALL</Custom>