Wix:立即或延迟执行的CustomAction失败

时间:2018-01-25 04:38:44

标签: batch-file cmd wix

环境:Windows 7 x64,Wix Toolset 3.10
你好
我不能通过自定义操作通过执行属性“立即”或“延迟”以任一方式调用cmd.exe。
运行时错误总是发生。 我可以通过自定义操作调用vbs命令,但不能触发.bat文件,

怎么了?我想输入和输出的路径可能不一致,但我找不到它 如果我只能用英语输出日志文件,请教我.... 在延迟操作中,记录InstallInitialize,InstallFinalize可能会建议我对Orca做一些事情,但我不确定应该做些什么。

以下是我的尝试细节:

根据https://alexanderst.wordpress.com/2010/10/28/wix-how-to-run-application-with-parameters-from-custom-action/中建议的示例 我对cmd.exe属性的定义如下:

    <Property Id="CMD">
      <DirectorySearch Id="CmdFolder" Path="[SystemFolder]" Depth="1">
        <FileSearch Id="CmdExe" Name="cmd.exe"  />
      </DirectorySearch>
    </Property>

我在下面定义批处理文件的目录:

    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder" Name="PFiles">
            <Directory Id="FugaFuga" Name="FugaFuga">
                <Directory Id="INSTALLDIR" Name="Hoge 1.0">
                    <Component Id="FugaFugaLibrary" Guid="MY-UID">
                        <File Id="test.bat" Name="test.bat" DiskId="1" Source="test.bat" KeyPath="yes" />
                    </Component>
                </Directory>
            </Directory>
        </Directory>
    </Directory>

我对发布事件DoAction的定义如下:

            <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="Next(&amp;N)">
                <Publish Event="DoAction" Value="CallCmdTest">1</Publish>
                <Publish Event="NewDialog" Value="NextDlg" />
            </Control>

test.bat内容如下(hoge.txt和temp \ hoge文件夹都存在)

    copy / Y C:\ temp \ hoge \ hoge.txt C:\ temp \ hoge \ hoge%date:〜-10,4 %% date:〜-5,2 %% date:〜-2,2%.txt

它只是将hoge.txt复制到一个笨蛋{%date%without slash} .txt

我尝试了Execute =“deferred”,但是当按下下一个按钮时会发生运行时错误。

    <CustomAction Id="CallCmdTest" Property="CMD" Return="check" Execute="deferred" Impersonate="yes" ExeCommand="/c &quot;&quot;[#test.bat]&quot;&quot;" />

它的日志文件(对不起日语字符......)(msiexec / i Main.msi / lv * Main-install.log结果:)错误2762但返回代码是3 ...

        アクション开始11:04:22:CallCmdTest。         MSI(c)(08:C0)[11:04:22:176]:注意:1:2762         调试:错误2762:无法安排操作。必须在InstallInitialize和InstallFinalize之间安排操作。         このパッケージをインストールしているときに,インストーラーに予期しないエラーが発生しましたこのパッケージに问题がある可能性がありますエラーコードは,2762です引数:。,,         MSI(c)(08:C0)[12:03:24:486]:制品:HogeHoge 1.12.0 - このパッケージをきール问题がある可能性があります。エラーコードは,2762です。引数:,,         アクション终了12:03:24:CallCmdTest。戻り値3。

我尝试了Execute =“immediate”但是在按下下一个按钮时发生了运行时错误:

    <CustomAction Id="CallCmdTest" Property="CMD" Return="check" Execute="immediate" ExeCommand="/c &quot;&quot;[#test.bat]&quot;&quot;" />

其日志文件(对不起日语字符...)(msiexec / i Main.msi / lv * Main-install.log结果:)错误2762但返回代码为3 ..

        アクション开始17:13:23:CallCmdTest。         MSI(c)(B8:C4)[17:13:24:034]:注意:1:1722 2:CallCmdTest 3:C:\ Windows \ SysWOW64 \ cmd.exe 4:/ c“”C:\ Program Files (x86)\ HogeHoge \ Hoge 1.0 \ test.bat“”         エラー1722この视窗インストーラーパッケージに问题がありますセットアップの一部として実行されるプログラムが正常に完了しませんでしたサポート担当者またはパッケージ开発元に问い合わせてくださいアクションCallCmdTest,场所:。C:\ Windows \ SysWOW64 \ cmd.exe,コマンド:/ c“”C:\ Program Files(x86)\ HogeHoge \ Hoge 1.0 \ test.bat“”         MSI(c)(B8:C4)[17:13:25:694]:制品:HogeHoge 1.12.0 - エラー1722.このWindowsインストーラーパッケージに题题に完了しませんでした。サポート担当者またはパッケージ开発元に问い合わせてください。アクションCallCmdTest,场所:C:\ Windows \ SysWOW64 \ cmd.exe,コマンド:/ c“”C:\ Program Files(x86)\ HogeHoge \ Hoge 1.0 \ test.bat“”         アクション终了17:13:25:CallCmdTest。戻り値3。         DEBUG:错误2896:执行操作CallCmdTest失败。         このパッケージをインストールしているときに,インストーラーに予期しないエラーが発生しましたこのパッケージに问题がある可能性がありますエラーコードは,2896です引数:。CallCmdTest ,,         アクション终了17:13:25:WelcomeDlg。戻り値3。         MSI(c)(B8:B8)[17:13:25:716]:采取行动:致命错误         アクション17:13:25:FatalError。

所有文件(Main.wxs,Main.wixobj,Main.msi,test.bat)都存在于一个文件夹中。 蜡烛,灯光,msiexec的所有命令都在同一目录中执行。

cd /d %~dp0

candle.exe Main.wxs
light.exe -cultures:ja-jp -ext WixUIExtension -out Main.msi Main.wixobj
msiexec /i Main.msi /lv* Main-install.log

1 个答案:

答案 0 :(得分:1)

正如Gerhard Barnard所说,使用自定义动作可能是正确的方法。看起来您正试图从UI触发自定义操作

  • 无法延迟,因为它来自用户界面
  • 除非整个安装程序已提升,否则无法提升
  • 如果您尚未实际安装该产品,将无法访问bat文件。

我会将您的bat文件重写为c#或c ++自定义操作,并按照Gerhard评论和其他SO问题链接中的说明将其包含在安装程序中。

此外,从UI事件启动的自定义操作无法轻松地将日志写入msi日志(或根本不可写?)。如果您适当地安排自定义操作,您将能够对自定义操作正在执行的操作进行信息记录。如有必要,您还可以调试自定义操作。在过去,我在自定义操作的开头显示了一个消息框,然后连接了一个调试器进行调试。