Wix Burn не позволяет удалить файл

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

<Chain>
  ...
  <ExePackage Id="removelnk" Cache="no" SourceFile="run.bat" InstallCommand="del &quot;C:\Users\Public\Desktop\Parity UI.lnk&quot;" />
</Chain>

куда run.bat это просто %* что позволяет запускать произвольный код, как описано здесь.

Тем не менее, это не работает:

[19EC:0E2C][2018-06-16T18:32:27]i301: Applying execute package: removelnk, action: Install, path: C:\ProgramData\Package Cache\1608BB75347CD8C40187E5F3C0A969ED73A98D51\run.bat, arguments: '"C:\ProgramData\Package Cache\1608BB75347CD8C40187E5F3C0A969ED73A98D51\run.bat" del "C:\Users\Public\Desktop\Parity UI.lnk"'
[19EC:0E2C][2018-06-16T18:32:27]e000: Error 0x80070001: Process returned error: 0x1
[19EC:0E2C][2018-06-16T18:32:27]e000: Error 0x80070001: Failed to execute EXE package.
[0AE4:2B94][2018-06-16T18:32:27]e000: Error 0x80070001: Failed to configure per-machine EXE package.
[0AE4:2B94][2018-06-16T18:32:27]i319: Applied execute package: removelnk, result: 0x80070001, restart: None
[0AE4:2B94][2018-06-16T18:32:27]e000: Error 0x80070001: Failed to execute EXE package.

Если я выполню эту команду из журнала в моем cmd тогда это работает как ожидалось. Это даже работает без прав администратора.

Что здесь не так?

2 ответа

Решение

Создание преобразования: вы можете использовать преобразование для изменения любого файла MSI - очень распространенное использование преобразования - удалить такие ярлыки. Вы должны иметь возможность применить это преобразование в командной строке, указанной в вашем загрузчике - хотя я никогда не пробовал это с загрузчиками WiX.

Преобразования - это "маленькие фрагменты базы данных", которые применяются к исходному MSI. Он изменяет файл MSI в памяти, и вы можете в значительной степени изменить все, что захотите. Вы можете создавать преобразования с Orca или эквивалентным бесплатным инструментом. Конечно, можно также использовать коммерческие инструменты, такие как Advanced Installer. На самом деле у них есть симпатичное небольшое видео, показывающее процесс (ближе к низу).

Здесь есть длинное объяснение преобразований (среди прочего): как лучше использовать файлы MSI.


Применение трансформации: вы применяете трансформации через свойство Transforms во время установки.

Быстрый пример командной строки:

msiexec.exe /I "My.msi" /QN /L*V "C:\My.log" TRANSFORMS="C:\1031.mst;C:\My.mst"

Краткое объяснение параметров:

/I = run installation sequence
/QN = run completely silently
/L*V "C:\My.log"= verbose logging
TRANSFORMS="C:\1031.mst;C:\My.mst" = Apply transforms 1031.mst and My.mst.

Детали пакета Burn: я не пробовал применять преобразование в пакете Burn (поэтому у меня не должно быть смысла отвечать), но, как мне кажется, вам нужен элемент MsiPackage. Я нашел этот довольно сложный образец исходного файла пакета Burn - возможно, стоит посмотреть? Кажется, магия заключается в дочернем элементе MsiProperty для элемента MsiPackage.


ОБНОВЛЕНИЕ:

Пример записи Hello-World Style: Наконец-то я запустил быстрый тест на компьютере с Windows (был на Linux). Вот как вы можете применить преобразование через Burn (минимальный пример, просто предназначенный для демонстрации основ, а не для того, чтобы быть хорошей разметкой).

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

Это будет применять преобразование ShortcutDesktop.mst к оригинальному MSI ShortcutDesktop.msi:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">

    <!-- Maybe generate yourself an Upgrade-GUID here: https://www.guidgenerator.com/ -->

    <Bundle Name="MyCoolTestApp" Version="1.0.0.0" Manufacturer="Someone"
            UpgradeCode="PUT-GUID-HERE">        

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

        <Chain>
            <MsiPackage SourceFile="ShortcutDesktop.msi">
                <MsiProperty Name="TRANSFORMS" Value="ShortcutDesktop.mst" />
            </MsiPackage>
        </Chain>

    </Bundle>

</Wix>

Для сборки пакета Burn BurnTest.wxs выше:

set SetupName=BurnTest

candle.exe %SetupName%.wxs -ext WixBalExtension >> %SetupName%.log
light.exe %SetupName%.wixobj -ext WixBalExtension >> %SetupName%.log

И ссылка на лучший пример Burn на github:

Burn не поддерживает пакетные файлы. Все, что модифицирует машину, должно быть сделано в упаковке.

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