【问题标题】:Run batch file in Windows Installer Commit在 Windows Installer Commit 中运行批处理文件
【发布时间】:2015-10-08 20:25:09
【问题描述】:

在安装主输出后,我无法成功修改 Windows Installer MSI 以运行批处理文件。我已经搜索过这个并找到了很多建议,但没有任何效果。

添加自定义操作
自定义动作只能是可执行文件。批处理文件不可执行。

创建运行批处理文件的 Windows 脚本宿主可执行文件
很多人都尝试过这样做,包括SO,但没有人能够让它发挥作用。

使用 WIX 或 InstallShield
我没有时间或权限更改公司安装程序技术。

使用 Orca 编辑 .msi 并添加自定义属性,然后添加自定义操作,然后编辑 InstallExecuteSequence,...
我已经尝试了几个小时,并且只创建了在我运行它们时会引发系统错误的安装程序。

【问题讨论】:

    标签: windows windows-installer custom-action


    【解决方案1】:

    你上面说的不正确:

    自定义操作只能是可执行的 文件。批处理文件不可执行。

    自定义操作(即使没有 InstallShield 等工具)可以基于 .EXE、VBScript、JScript 或 DLL。如果您编写 DLL,您可以编写任何代码来调用批处理文件或对系统进行任何更改——没有限制。

    更新:一个对我有用的示例:(CustomAction 表中的条目)

    Action Test
    Type 34
    Source SystemFolder
    Target cmd.exe /c c:\test.bat
    ExtendedType <blank>
    

    【讨论】:

    • 你给出的每个例子都是一个可执行文件。批处理文件不可执行。不要相信我的话,试试吧。
    • DLL 是如何成为可执行文件的?
    • 因为它包含字节码,就像一个EXE。但是,您给了我创建一个在 shell 中运行批处理文件的 EXE 的想法。会尝试...
    • 创建一个 EXE 是可行的,但是将目标设置为 cmd.exe 是一个更好的主意。
    【解决方案2】:

    我能够通过创建一个主要包含以下内容的 EXE 来解决这个问题:

    System.Diagnostics.Process.Start(pathToBatchFile);
    

    将 EXE 添加到 MSI 文件,然后将其作为自定义操作运行。

    【讨论】:

      【解决方案3】:

      虽然“William Leara”提出的答案是一个很好的开始,但我发现了一个更好的解决方案here 值得一提。

      此方法的另一个优点是您可以将批处理文件放在应用程序安装文件夹而不是根 C 文件夹中,但我们使用特殊标志将执行推迟到 FileCopy 操作之后,我们还使用 noImpersonate 获得从 Program Files

      运行所需的更高权限

      几点说明:

      1. 使用 TARGETDIR 代替 INSTALLDIR
      2. 确保引用路径。

      这是我的两个自定义操作。在我的情况下,我想强制 native 命令处理器修复一些注册表项,因此我不使用 COMSPEC

      第一个动作(类型 50)使用 Target 的输入参数在 Source 中执行命令,因为 Type 是 50+1024+2048,它是带有 noImpersonate 标志的延迟动作。

      • 动作:FinalAction
      • 类型:3122
      • 来源:NCOM
      • 目标:/c "[TARGETDIR]Fixup.bat"

      第二个动作立即定义NCOM属性:

      • 行动:FinalNativeSys
      • 类型:51
      • 来源:NCOM
      • 目标:[WindowsFolder]System32\cmd.exe

      那么你应该将这些操作添加到InstallExecuteSequence

      • 动作:FinalAction
      • 条件:未安装
      • 序列:5002

      还有这个:

      • 行动:FinalNativeSys
      • 条件:
      • 序列:5001

      请注意,在我的情况下,我也可以轻松调整操作以调用 reg.exe import Fixup.reg。 最后,可以按照建议here 在后期构建中使用 msitran 来自动化该过程。

      【讨论】:

        【解决方案4】:

        制作一个 EXE,制作一个临时 .bat 文件以更改为您想要的任何目录,并 CALL 另一个 bat 文件,可以满足您的需要。

        告诉自定义操作使用该 exe。

        CPP exe 的第一个参数是 exe 本身的路径。这可以用来定位自己,并且这些信息可以用于制作临时 .bat

        【讨论】:

          【解决方案5】:

          就我而言,我添加了“自定义操作”。
          在文件夹“安装”上选择“添加自定义操作”
          选择 cmd.exe (c:\windows\system32\cmd.exe)
          然后在 cmd.exe 的属性中将“参数”编辑为
          "/Install /c C:\myApp.exe --exec-some-action"

          【讨论】:

            猜你喜欢
            • 2014-09-05
            • 1970-01-01
            • 1970-01-01
            • 2017-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-21
            相关资源
            最近更新 更多