我需要编写一个 WiX 捆绑包,除非系统上存在某个注册表项,否则该捆绑包不会运行。
\n\n在正常的安装项目中,我会使用启动条件,但我不创作安装项目,而只是创作顶级包。该<Bundle>元素有一个Condition属性,但在 Burn 手册中它说:
\n\n\n捆绑的状况。如果不满足条件,捆绑包将拒绝运行。在加载引导程序应用程序之前(检测之前)检查条件,因此只能引用内置变量,例如指示操作系统版本的变量。
\n
因此,看来除了最基本的高级检查之外,我不能使用元素Condition的 \xc2\xa0 属性进行任何操作,当然也不能用于我需要的功能。Bundle
那么,如何在捆绑包级别检查注册表项,并在该项不存在时拒绝继续?
\n我已经使用 ExePackage 和 RemotePayload 实现了先决条件,因为我需要使用运行时 webinstaller (DownloadURL) 下载包。但是,当软件包在某个时间(例如季度更新)后升级时,软件包版本和哈希值也会发生变化。因此,我收到类似 0x80091007 的错误(哈希值不正确)。因此,如果有人知道如何忽略哈希值检查,请帮助我。下面是我已经实现的代码:
<ExePackage
Id="MicrosoftEdgeWebview2"
DisplayName="Microsoft Edge Webview2 Runtime"
Compressed="no"
Cache="no"
PerMachine="yes"
Vital ="yes"
Permanent ="yes"
InstallSize="1"
InstallCommand="/silent /install"
DetectCondition="MicrosoftEdgeWebview2Version >= $(var.MicrosoftEdgeWebview2MinimumVersion) OR MicrosoftEdgeWebview2Version64 >= $(var.MicrosoftEdgeWebview2MinimumVersion)"
Name="MicrosoftEdgeWebview2Setup.exe"
DownloadUrl="https://go.microsoft.com/fwlink/p/?LinkId=2124703">
<RemotePayload
ProductName="Microsoft Edge Webview2 Runtime"
Description="Microsoft Edge Webview2 Runtime Setup"
Hash="080e3e4cdcfc809762a32e8fa7cdc0f37b8e36a5"
Size="1778968" Version="1.3.153.47" />
Run Code Online (Sandbox Code Playgroud) 在尝试构建依赖于.NET 4框架的Burn引导程序时,我遇到了一个奇怪的错误.我已经下载了WiX设置的源代码并将其包含NetFx.wxs在我的项目中并在Chain中添加了PackageGroupRef,但是我收到以下错误:
错误LGHT0103:系统找不到文件'dotNetFx40_Full_x86_x64.exe'
档案Netfx.wxs:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<WixVariable Id="WixMbaPrereqPackageId"
Value="Netfx4Full" />
<WixVariable Id="WixMbaPrereqLicenseUrl"
Value="NetfxLicense.rtf" />
<util:RegistrySearch Root="HKLM"
Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
Value="Version"
Variable="Netfx4FullVersion" />
<util:RegistrySearch Root="HKLM"
Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
Value="Version"
Variable="Netfx4x64FullVersion"
Win64="yes" />
<PackageGroup Id="Netfx4Full">
<ExePackage Id="Netfx4Full"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="dotNetFx40_Full_x86_x64.exe"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
</PackageGroup>
</Fragment>
</Wix>
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我使用WPF编写了一个托管的wix bootstrapper.实际安装步骤需要链接多个msi/exe和批处理文件.
<Chain>
<MsiPackage SourceFile="xxx"/>
<ExePackage Id="Test" SourceFile="..\TestBatch.bat" Vital="yes"/>
<MsiPackage SourceFile="yyy"/>
</Chain>
Run Code Online (Sandbox Code Playgroud)
在执行每个包期间,应该显示一条消息(最好来自引导程序UI),指示当前正在执行哪个msi/exe包/批处理文件.简而言之,引导程序中需要一个ProgressText如何实现这一点?
另一个问题:我不希望所有的msi被打包到bootstrapper exe中.这是因为:每次更改msi时,我们只想发送更新/修改的msi,而不是整个bootstrapper exe.有没有办法做到这一点?
我正在运行WiX捆绑包安装.如果运行,其中一个MSI软件包应该关闭应用程序:
<util:CloseApplication Id="CloseApplication" Target="My App.exe">1</util:CloseApplication>
Run Code Online (Sandbox Code Playgroud)
这是<Product>元素之前的<Feature>元素.我添加了1以确保条件为真.
MSI日志有这样的说法:
MSI (s) (14:94) [21:30:13:979]: Doing action: WixCloseApplications
Action ended 21:30:13: CreateFolders. Return value 1.
MSI (s) (14:68) [21:30:13:993]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI5D24.tmp, Entrypoint: WixCloseApplications
MSI (s) (14!CC) [21:30:14:023]: PROPERTY CHANGE: Adding WixCloseApplicationsDeferred property. Its value is 'My App.exe2'.
Action start 21:30:13: WixCloseApplications.
MSI (s) (14!CC) [21:30:14:023]: Doing action: WixCloseApplicationsDeferred
Action start 21:30:14: WixCloseApplicationsDeferred.
Action ended 21:30:14: WixCloseApplicationsDeferred. Return value 1.
MSI (s) (14:94) [21:30:14:052]: Doing …Run Code Online (Sandbox Code Playgroud) 我创建了一个成功安装所有链接包的Wix Burn boostrapper.当我运行卸载时,它不会卸载以下MSI包.为什么?此外,我意识到这个问题已被提出,但以前提出的问题似乎都没有答案.
<MsiPackage Id="SyncManager" Name="Sync Manager 2.0" Permanent="yes" Vital="yes" Compressed="yes"
DownloadUrl="http://localhost/SyncManager2.0.msi" SourceFile="SyncManager2.0.msi">
<Payload DownloadUrl="http://localhost/SyncManager2.0.msi" SourceFile="SyncManager2.0.msi" Name="Synce Manager 2.0" />
</MsiPackage>
Run Code Online (Sandbox Code Playgroud)
先感谢您.
所有平台的安装程序的升级代码和产品代码是否必须相同?
我们应该为不同平台的组件使用不同的 GUID 吗?我将 msi 捆绑在burn bootstrapper 中。
这是我的 Fragment
<Fragment>
<Variable Name="Hasp_BundleVersion" Value="7.54.8889.1" />
<Variable Name="Hasp_IsInstalled" />
<Variable Name="Hasp_InstalledVersion" />
<util:RegistrySearch Id="Hasp_IsInstalled"
Variable="Hasp_IsInstalled"
Root="HKLM"
Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
Value="Version"
Result="exists" />
<util:RegistrySearch Condition="Hasp_IsInstalled"
After="Hasp_IsInstalled"
Variable="Hasp_InstalledVersion"
Root="HKLM"
Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
Value="Version"
Result="value" />
<PackageGroup Id="Hasp">
<ExePackage Id="Hasp"
DisplayName="Hasp"
SourceFile="setups\HASPUserSetup.exe"
Compressed="yes"
DetectCondition="Hasp_IsInstalled AND Hasp_InstalledVersion >= Hasp_BundleVersion"
InstallCommand="/s /v/qn"
PerMachine="yes"
Permanent="yes" />
</PackageGroup>
</Fragment>
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它似乎将两个值作为字符串进行比较。这是日志:
[0A74:0A4C][2017-03-29T16:29:02]i000: Initializing string variable 'Hasp_BundleVersion' to value '7.54.8889.1'
[0A74:0A4C][2017-03-29T16:29:02]i000: Setting numeric variable 'Hasp_IsInstalled' to value 1
[0A74:0A4C][2017-03-29T16:29:02]i000: Setting string variable 'Hasp_InstalledVersion' to value '7.54.66980.1'
[0A74:0A4C][2017-03-29T16:29:02]i052: Condition …Run Code Online (Sandbox Code Playgroud) 我们的安装程序使用CustomAction(在InstallExecuteSequence中调用)可选地从安装程序旁边的目录中复制用户配置文件.这使用[SourceDir]来定位源目录.
我们目前有32位和64位版本,它们作为单独的.MSI文件分发.我正在尝试使用Burn构建包含这些.MSI文件的单个.EXE.显然当Burn安装了MSI时,它的[SourceDir]位于其他地方(我看到了C:\ProgramData\Package Cache\...路径),所以这个自定义动作不起作用.
我找到了WixBundleOriginalSource变量,但我的问题是我希望MSI文件能够独立工作并与Burn一起打包.我认为我需要有条件地将变量设置为WixBundleOriginalSource(如果已定义(用户使用Burn .exe))或者如果未定义WixBundleOriginalSource(用户直接安装.MSI)则将SourceDir设置为SourceDir,然后将此变量传递给我的自定义操作.(我知道WixOriginalSource是安装程序的完整路径,而不是它所在的目录 - 我可以在我的自定义操作中处理它.)
这可能吗?如果是这样,请帮我解释一下语法.
更新:
我可能会在自定义操作中处理条件部分,并调用它两次:一次使用[SourceDir](直接使用MSI时有效),正如我现在所做的那样:
在我的产品中
<CustomAction Id='CopyConfigFiles'
FileKey="MyInstallationUtility"
ExeCommand="COPYFILES [SourceDir]"
Execute="deferred"
Impersonate="no"
Return="ignore" />
Run Code Online (Sandbox Code Playgroud)
......和一次WixBundleOriginalSource.但是,我找不到办法让WixBundleOriginalSource我自定义动作.使用:
ExeCommand="COPYFILES [WixBundleOriginalSource]"
Run Code Online (Sandbox Code Playgroud)
......不起作用.使用:
在我的Burn Bundle中
<WixVariable Id="ConfigFileLocation" Value="[WixBundleOriginalSource]" />
Run Code Online (Sandbox Code Playgroud)
在我的产品中
ExeCommand="COPYFILES [ConfigFileLocation]"
Run Code Online (Sandbox Code Playgroud)
......也行不通.两者都给我一个空字符串作为参数.
我正在创建一个bootsrapper,我想删除在安装过程中创建的链接.所以我写下面的步骤:
<Chain>
...
<ExePackage Id="removelnk" Cache="no" SourceFile="run.bat" InstallCommand="del "C:\Users\Public\Desktop\Parity UI.lnk"" />
</Chain>
Run Code Online (Sandbox Code Playgroud)
其中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.
Run Code Online (Sandbox Code Playgroud)
如果我从登录中执行此命令,cmd那么它按预期工作.它甚至没有管理员权限. …