wixwindows-installersymlinkmklink

Creating a symbolic link in a WiX installer using relative paths


I have been trying to do something like what is posted here about creating a symbolic link in a WiX installer. It explains how to make a add-on that will make a symbolic link. However that is not what I am looking for. I am trying to use somtething like this snipping

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

I have tried using cmd.exe instead of cmd for this and have not been successful.

I am then call the custom action like this:

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

I have tried calling this before InstallFinalize as well and I get the same behavior.

I am aiming to create the symbolic link through this setup. The other solution I have is being able to create a shortcut however I have not been able to find much on how to do this option for places other than the start menu or the Desktop

When I run the installer after adding these lines it fails to execute them. Without the Symbolic link custom action being called I can get the installer to complete successfully.

End goal is to get a symbolic link from the common files executable to the install location of the application.

Update

I got the Symbolic link to work changed custom action now looks like:

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

and the call to the custom action like this:

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

But now the when I run uninstall I get the following error message: 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.


Solution

  • If you use something like this as your Custome action:

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

    in your InstallExecuteSequence there needs to be:

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

    This makes sure that this is only executed on install of your application. If you want to execute this on reinstall or other options you may need to look into how to do that further

    If making sure to leave zero footprint behind after a user uninstalls the application you will need to delete the symbolic link afterwards. I solved this by doing the following:

    First I created another CustomAction

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

    Then I needed another InstallExecuteSequence to execute this. However I only needed to run this on uninstall so it needed a different conditional in to do that so this one looked like:

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