6

我在 WiX 安装程序中有一个 ServiceInstall 组件,我需要根据传递给 MSI 的参数启动自动或需求。

所以有问题的 Xml 元素是

<ServiceInstall Vital="yes"
     Name="My Windows Service"
     Type="ownProcess"
     Account="[SERVICEUSERDOMAIN]\[SERVICEUSERNAME]"
     DisplayName="My Service"
     Password="[SERVICEUSERPASSWORD]"
     Start="demand"
     Interactive="no"
     Description="Something interesting here"
     Id="Service"
     ErrorControl="ignore"></ServiceInstall>

WiX 不允许对 Start 属性使用 PArameter,因此我坚持使用条件完全复制组件,例如/

<Component Id="ServiceDemand"
                 Guid="{E204A71D-B0EB-4af0-96DB-9823605050C7}" >
        <Condition>SERVICESTART="demand"</Condition>    
...

并完全复制整个组件,使用不同的 Start 设置和不同的 Condition。

有人知道更优雅的解决方案吗?一个我不需要维护的组件,除了 Start 的 Attribute 之外,它们做完全相同的事情?

4

2 回答 2

6

ServiceInstall 表中的 Start 字段未格式化,因此您使用属性输入的内容将不起作用。此链接提供了一些有用的建议,可能会帮助您完成它:ServiceInstall - Start element。看起来发帖的人也有同样的问题。他们提供的我最喜欢的建议是创建一个在 InstallServices 操作之前运行的自定义操作,该操作将更改 Service Install 表中 Start 元素的值。

更新:修改了指向建议站点的链接。

于 2010-03-23T17:32:21.343 回答
1

不幸的是,用于安装和控制服务的标准 Wix 功能非常有限。

虽然不理想,但可以使用 CustomAction 来完成,例如使用 CAQuietExec(如果您使用它,它还可以方便地将输出保存到安装日志文件)

  <CustomAction Id="QtExec_Install_Cmd" Property="QtExec_Install" Value="sc create [SERVICE_NAME] binPath=&quot;[INSTALLFOLDER]$(var.MAIN_EXECUTABLE)&quot; start=[SERVICE_START_FLAG]" Execute="immediate" />
  <CustomAction Id="QtExec_Install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <CustomAction Id="QtExec_Uninstall_Cmd" Property="QtExec_Uninstall" Value="sc delete [SERVICE_NAME]" Execute="immediate" />
  <CustomAction Id="QtExec_Uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <InstallExecuteSequence>
    <Custom Action="QtExec_Install_Cmd" After="CostFinalize"/>
    <Custom Action="QtExec_Install" After="InstallServices">&amp;WindowsService=3</Custom>
    <Custom Action="QtExec_Uninstall_Cmd" After="CostFinalize"/>
    <Custom Action='QtExec_Uninstall' Before="RemoveFiles">NOT &amp;WindowsService=3 AND NOT &amp;WindowsService=-1</Custom>
  </InstallExecuteSequence>

笔记:

  • WindowsService 是功能的名称

  • SERVICE_START_FLAG 是控制是否启动服务的属性

  • [INSTALLFOLDER]$(var.MAIN_EXECUTABLE) - 是可执行文件的路径

  • SERVICE_NAME 是 Windows 服务的所需名称

于 2017-01-18T10:49:36.047 回答