在自定义操作中复制批处理文件的行为

Posted

技术标签:

【中文标题】在自定义操作中复制批处理文件的行为【英文标题】:Replicate Behavior of a Batch File in a Custom Action 【发布时间】:2013-08-28 18:29:29 【问题描述】:

我正在工作中创建一个 wix 安装程序,我需要能够在自定义操作中复制此批处理文件的行为:

start /d "C:\Program Files (x86)\Remindex" INSTSRV.EXE RemindexNP 
"C:\Program Files (x86)\Remindex\SRVANY.EXE"

我正在尝试使用普通的 Windows 应用程序创建服务,SRVANY.EXE 可以做到这一点。这个批处理文件运行正常,但我似乎无法获得自定义操作来做同样的事情。我试过这个:

<CustomAction Id="RunNP" FileKey="FILE_INSTALLFOLDER_INSTSRVEXE" 
              ExeCommand="RemindexNP [INSTALLFOLDER]SRVANY.EXE" Execute="commit" Return="ignore"/>

此自定义操作不会导致我在日志文件中看到的任何错误,但我认为 instsrv.exe 不接受我在 ExeCommand 中传递的参数。我知道 instsrv.exe 和 srvany.exe 存在,因为我在 InstallFinalize 之前运行自定义操作。

有人知道我的自定义操作有什么问题吗?

我不希望在我的安装文件夹中包含实际的批处理文件,因为除了在安装时运行之外,它没有任何理由存在。我尝试在安装程序中包含一个,但我不知道如何引用安装目录。当我使用 %cd% 时,它只是出于某种原因引用了系统文件夹。

我尝试使用 ServiceInstall 和 ServiceControl 元素,但安装程序卡在“启动服务”上。这是我的组件:

<Component Id="CMP_RemindexNP.exe" Guid="3FB99890-752D-4652-9412-72230695A520">
    <File Id="FILE_INSTALLFOLDER_RemindexNPEXE" Source="RemindexNP.exe" KeyPath="yes"/>
        <RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\RemindexNP\Parameters">
          <RegistryValue Id="rg_remNP1" Action="write" Name="AppDirectory" Value="[INSTALLFOLDER]" Type="string"/>
          <RegistryValue Id="rg_remNP2" Action="write" Name="Application" Value="[INSTALLFOLDER]RemindexNP.exe" Type="string"/>
        </RegistryKey>
        <ServiceInstall DisplayName="RemindexNP" Id="srv_remNP" Name="RemindexNP" Start="auto" Type="shareProcess" ErrorControl="ignore"/>
        <ServiceControl Id="srvc_remNP" Name="RemindexNP" Remove="both" Start="install" Stop="uninstall" Wait="no"/>
      </Component>

还有我的日志:

Action 17:15:08: StartServices. Starting services
Action start 17:15:08: StartServices.
StartServices: Service: Starting services
Action ended 17:15:08: StartServices. Return value 1.

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

这是一个技巧问题,因为您不需要自定义操作。 srvany.exe 充当服务主机,因此可以使用 Directory、Component、File、ServiceInstall 和(如果需要)ServiceControl 元素将其创作到您的安装程序中。

【讨论】:

感谢您的回复,我试过了,它似乎工作正常,除了在安装时,安装程​​序卡在“启动服务”上。它永远不会超过那个点。如果您可以看一下,我已将该组件添加到我的原始问题中。 ServiceInstall 元素的目标是父组件的密钥文件。在您的情况下,密钥文件需要是 Serveany.exe,因为它知道如何成为服务。 You're other EXE 实际上是一个伴随文件,它是通过注册表传递给 srvany.exe 的参数。

以上是关于在自定义操作中复制批处理文件的行为的主要内容,如果未能解决你的问题,请参考以下文章

Inno Setup - 在自定义页面上复制带有进度条的文件

在自定义操作之前安装组件

WebResource实现在自定义控件中内嵌JS文件

如何在自定义 R 函数中使用文本字符串作为变量

如何在自定义操作的 ExeCommand 中添加对文件的引用?

在批处理文件中使用 CLIP 命令