Создание символической ссылки в установщике WiX с использованием относительных путей

Я пытался сделать что-то вроде того, что опубликовано здесь о создании символической ссылки в установщике WiX. В нем объясняется, как сделать надстройку, которая создаст символическую ссылку. Однако это не то, что я ищу. Я пытаюсь использовать что-то вроде этого

<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, и я получаю такое же поведение.

Я стремлюсь создать символическую ссылку с помощью этой настройки. Другое решение, которое у меня есть, - это возможность создать ярлык, однако я не смог найти много информации о том, как сделать эту опцию для мест, отличных от меню «Пуск» или рабочего стола.

Когда я запускаю установщик после добавления этих строк, он не может их выполнить. Без вызова настраиваемого действия символической ссылки я могу успешно завершить установку.

Конечная цель — получить символическую ссылку из общих исполняемых файлов на место установки приложения.

Обновлять

Я получил символическую ссылку для работы, измененное пользовательское действие теперь выглядит так:

<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.


person Vince Seely    schedule 01.08.2018    source источник
comment
Почему вы усложняете мысли, используя относительный путь для файла .lnk? Вы пытались использовать абсолютный путь? Также я думаю, что вы неправильно поняли цитату. Используйте одинарные внешние кавычки (ExeCommand='something') и двойные внутренние кавычки (для путей).   -  person zett42    schedule 06.08.2018
comment
@zett42 zett42 Я пытался сделать это с обеими настройками котировок, обе они у меня еще не сработали. Я попытался использовать абсолютный путь к общим файлам, но не к самому файлу .lnk. ExeCommand теперь ='cmd /c mklink .\linkToItem.lnk "C:\Program Files (x86)\Common Files\Additional Folders\myexecutable.exe"' При запуске установщика я мельком увидел окно CMD, в котором говорилось, что разрешение отклонено.   -  person Vince Seely    schedule 10.08.2018


Ответы (1)


Если вы используете что-то подобное в качестве пользовательского действия:

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

Это гарантирует, что это выполняется только при установке вашего приложения, если вы хотите выполнить это при переустановке или других параметрах, которые вам могут понадобиться для дальнейшего изучения.

Если вы хотите оставить нулевой след после того, как пользователь удалит приложение, вам нужно будет впоследствии удалить символическую ссылку. Я решил это, выполнив следующие действия:

Сначала я создал еще один 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>
person Vince Seely    schedule 10.08.2018