【问题标题】:Wix burn doesn't allow to remove file蜡刻录不允许删除文件
【发布时间】:2018-06-16 15:39:51
【问题描述】:

我正在创建一个引导程序,并且我想删除在安装过程中创建的链接。所以我写了以下步骤:

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

其中run.bat 就是%*,它允许运行任意代码,如here 所述。

但是,它不起作用:

[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 执行此命令,那么它会按预期工作。它甚至可以在没有管理员权限的情况下工作。

这里有什么问题?

【问题讨论】:

  • 查看 MSI 中的哪些功能具有带有快捷方式的组件。 (尝试 dark.exe 或 orca 或 InstEdit)如果您可以不使用该功能,只需在安装期间将其排除。否则按照@Stein 的建议进行操作。

标签: wix windows-installer installation burn


【解决方案1】:

创建转换:您可以使用 transform 修改任何 MSI 文件 - 转换的一个非常常见的用途是删除此类快捷方式。您应该能够在引导程序中指定的命令行上应用该转换 - 尽管我从未尝试过使用 WiX 引导程序。

转换是应用于原始 MSI 的“小数据库片段”。它会更改内存中的 MSI 文件,您几乎可以更改任何您想要的内容。您可以使用Orca or an equivalent free tool 创建转换。当然,也可以使用商业工具(例如 Advanced Installer)。事实上他们有a nice little video showing the process(朝向底部)。

这里有很长的转换解释(除其他外):How to make better use of MSI files


应用转换:您在安装过程中通过Transforms property 应用转换。

快速示例命令行

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 Bundle 详细信息:我没有尝试在 Burn 包中应用转换(所以我应该不回答),但 MsiPackage element 是你需要什么我相信。 I found this rather complicated sample 的 Burn 包源文件 - 也许值得一看?看来MsiProperty child element 的魔力在于MsiPackage element


更新

Burn Hello-World 样式示例:终于在 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

以及 github 上更好的 Burn 示例的链接:

【讨论】:

  • 我还没有尝试过,但它看起来很有希望。很好的答案,谢谢
  • 我听到一些传言,以这种方式应用变换可能并非在所有情况下都有效 - 例如修复。请彻底测试。它适用于我的测试。
【解决方案2】:

Burn 不支持批处理文件。修改机器的一切都应该在一个包中完成。

【讨论】:

  • 所以让我创建一个安装程序,其中一个功能是删除机器上的某些文件?
  • 好吧,如果可以的话,我想这样做,但我正在创建引导程序的不是我的安装程序。我想知道我是否可以自动删除这个由另一个 MSI 创建的快捷方式。
  • @Alex 您的建议是损坏已安装的组件。您的更改可能会被“修复”撤销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2011-12-11
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多