Как заставить установщик Windows заменить ярлык на переименованный?

Недавно мы добавили функцию в наш установщик, которая требовала, чтобы пара ярлыков на рабочем столе была слегка переименована (к имени был добавлен номер версии). У меня проблемы с тем, чтобы программа установки сменила старые ярлыки на новые. Когда первоначально сообщалось о проблеме, новые ярлыки устанавливались, но старые не удалялись. После работы над проблемой возникла смешанная проблема: один из старых ярлыков удаляется (пока что хорошо), а другой - нет (не очень хорошо), и в обоих случаях новые ярлыки не устанавливаются (даже хуже). Я попытался изменить GUID для каждого из компонентов, которые устанавливают эти ярлыки, и я даже однажды пытался изменить свойство ProductCode в каждом из модулей слияния, отвечающих за ярлыки, но, похоже, ничто не дает желаемого поведение (со старым и с новым при обновлении).

Пересматривая только соответствующие компоненты, вот что показывает файл журнала для состояний установки (для облегчения отладки я слегка переименовал компоненты, чтобы определить, какие из старой сборки, а какие - из новый):

...
MSI (s) (E0:70) [16:49:21:921]: Component: DesktopFolderX.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (E0:70) [16:49:21:921]: Component: DesktopFolderX.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (E0:C0) [17:02:18:390]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Local;   Request: Absent;   Action: Absent
...
MSI (s) (E0:C0) [17:02:18:390]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Local;   Request: Absent;   Action: Null
...

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

К вашему сведению: моя среда разработки - Wise Installation Studio 7.0.

Изменить: я сбросил все до того, что было ранее, за исключением текущего ProductVersion и ProductCode. Сделав это, установщик оставляет старые ярлыки установленными, но не устанавливает новые. (Это поведение отличается от того, о чем первоначально сообщалось, и которое мне удалось воспроизвести, т. Е. Старые ярлыки были оставлены установленными, а также были установлены новые (переименованные).) После повторного НАПРАВЛЕНИЯ двух соответствующих компонентов программа установки удаляет старые ярлыки, но не устанавливает новые. (Это то, что происходит на XP.)

Соответствующие строки в журнале после повторной идентификации компонентов выглядят следующим образом:

...
MSI (s) (80:EC) [10:48:31:091]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (80:EC) [10:48:31:091]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Absent;   Request: Local;   Action: Local
...
MSI (s) (80:0C) [11:04:22:882]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Local;   Request: Absent;   Action: Absent
...
MSI (s) (80:0C) [11:04:22:882]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Local;   Request: Absent;   Action: Absent
...

Первые две строки указывают на то, что новые ярлыки устанавливаются, а они - нет. После ремонта будут установлены новые ярлыки.

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

Изменить 2: текущее поведение заключается в том, что старые ярлыки остаются установленными, а новые не установлены. Когда я повторно GUID их компонентов, старые ярлыки удаляются, а новые по-прежнему не устанавливаются. Я попробовал решения Кристофера Пейнтера, но никуда не ушел. (См. Мой комментарий к этому ответу.) Должен быть способ установки новых версионных ярлыков вместо старых неверсированных. Кто-нибудь может предложить решение, которое работает?

Редактировать 3: Как оказалось, новое поведение, при котором новые ярлыки не устанавливались, было связано с ошибкой, которую я совершил при получении исходных файлов, а те, что были добавлены в установщик, не были обновлены как те, которые должны были быть заменены. Как только самые последние файлы были скомпилированы в программу установки, я смог получить желаемые результаты (старые ярлыки, новые). (Смотрите мой ответ для получения дополнительной информации.)

2 ответа

Решение

Поскольку мы переопределяем все версии для каждого оборота (число сборок постоянно увеличивается), это является серьезным обновлением для WI, поэтому, как только я установил самые свежие файлы в установку, перераспределил компоненты, содержащие рабочий стол. ярлыки, которые должны были быть заменены, достигли результатов, к которым я стремился.

Ярлык - это просто файл.lnk в каталоге. Вы не переименовываете ярлык, вы удаляете его и создаете новый. Если вы делаете серьезное обновление, удаление / переустановка должны справиться с этим, но если вы делаете незначительное обновление, оно оставит старое, потому что новый MSI не знает об этом.

Две возможности:

1) Используйте таблицу RemoveFile, чтобы избавиться от старого ярлыка.

2) Держите старый компонент вместе со старым файлом и используйте переходный атрибут с условием запрета использования (Google, как удалить файл при незначительном обновлении, также называемом шаблоном компонента прокола), чтобы вызвать удаление компонента и его файла / ярлыка. Создайте новый компонент с новым именем файла и новым именем ярлыка, который будет установлен, чтобы получить новый ярлык.

Я думаю, что сначала попробую #1.:-)

Другие вопросы по тегам