这是Wix - Keeping track of installed applications的重复,但接受的答案只是表明可以做一些不同于所要求的事情。
所以,(在WiX中)如何让Per Machine安装程序为来自单个公司的单独产品制作,每个产品都有开始菜单/程序/ CompanyName / ProductName下的快捷方式(每个产品的ProductName更改),以便开始菜单/程序当且仅当所有产品都已卸载时,/ CompanyName才会被删除?
具体名称无关紧要,但为了便于讨论,假设CompanyName是ExampleLLC,其产品名为ProductA,ProductB和ProductC。假设每个产品都有一个单独的安装程序,并且快捷方式分别是由同一产品安装程序安装的文件。因此,分别将它们称为RunA,RunB和RunC,分别针对ProductA.exe,ProductB.exe和ProductC.exe。
要清楚“开始菜单/程序”映射到Windows 7下的“C:\ Users \ All Users \ Microsoft \ Windows \ Start Menu \ Programs”,但其他操作系统版本的映射方式不同。
注意:答案必须适用于perMachine安装,如果必须忽略ICE警告,请提及它们。
这听起来微不足道,但是WiX和安装程序SDK会在我尝试的所有内容中发出错误或警告。他们需要一个“密钥”来检查机器上是否仍存在某些东西(或其集合),并且对目录和快捷方式都有偏差作为密钥。并且他们对每个用户安装的项目提出了特殊要求,但是不相信“ProgramMenuFolder”不是每个用户进行“perMachine”安装。
答案 0 :(得分:0)
只需将安装快捷方式的相同组件(具有相同的GUID)包含在两个产品中。 MSI将自行计算和处理已安装的组件。
答案 1 :(得分:0)
忽略ICE64(即告诉light.exe这样做)和“就这样做”。 但请使用广告快捷方式或查看问题Wix create non advertised shortcut for all users / per machine 如果您执行这两项操作,“CompanyName”的额外嵌套级别将无关紧要。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="ProductA" Language="1033" Version="1.0.0.0" Manufacturer="ExampleLLC" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Media Id="1" Cabinet="Setup.cab" EmbedCab="yes" CompressionLevel="high" />
<Property Id="DISABLEADVTSHORTCUTS" Value="1" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramMenuFolder">
<Directory Id="MyStartMenuCompanyFolder" Name="ExampleLLC">
<Directory Id="MyStartMenuProductFolder" Name="ProductA" />
</Directory>
</Directory>
<Directory Id="ProgramFilesFolder">
<Directory Id="MyProgramFilesCompanyFolder" Name="ExampleLLC">
<Directory Id="MyProgramFilesProductFolder" Name="ProductA">
<Component Id="ProductA.exe">
<File Source="../ProductA/bin/$(var.Configuration)/ProductA.exe" KeyPath="yes">
<Shortcut Id="RunA" Name="RunA" Directory="MyStartMenuProductFolder" Advertise="yes"/>
</File>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id="Complete" Level="1">
<ComponentRef Id="ProductA.exe" />
</Feature>
</Product>
</Wix>
生成2个ICE错误实例64抱怨每个目录(MyStartMenuProductFolder和MyStartMenuCompanyFolder)“在用户配置文件中但未在RemoveFile表中列出”。
如果制作一个重复的WiX文件替换ProductB替换ProductA(和RunB for RunA),那么忽略此错误会使安装程序完成他们应该做的事情。
所以不要相信ICE64暗示在卸载时不会删除某些内容。忽略错误,只测试安装程序。
注意:此错误与额外的目录级别无关,但是在尝试躲避它并与ICE43和ICE57进行战斗时,如果您尝试使用非广告的快捷方式,则会弹出“让我陷入困境” “使用内部目录(MyStartMenuProductFolder)作为组件的KeyPath,仅包含RunA快捷方式。哪个工作正常,但留下了外部目录(MyStartMenuCompanyFolder)的ICE64警告。