6

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

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

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

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

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

5 回答 5

10

你上面说的不正确:

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

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

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

Action Test
Type 34
Source SystemFolder
Target cmd.exe /c c:\test.bat
ExtendedType <blank>
于 2009-06-15T22:27:43.293 回答
2

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

System.Diagnostics.Process.Start(pathToBatchFile);

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

于 2009-06-16T16:12:06.740 回答
1

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

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

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

于 2011-06-16T17:58:37.323 回答
1

虽然“William Leara”提出的答案是一个很好的开始,但我在这里找到了一个更好的解决方案,值得一提。

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

几点注意事项:

  1. 使用TARGETDIR而不是INSTALLDIR
  2. 确保引用路径。

这是我的两个自定义操作。就我而言,我想强制本机命令处理器修复一些注册表项,因此我不使用COMSPEC

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

  • 行动:最终行动
  • 类型:3122
  • 资料来源:NCOM
  • 目标:/c "[TARGETDIR]Fixup.bat"

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

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

然后您应该将这些操作添加到InstallExecuteSequence

  • 行动:最终行动
  • 条件:未安装
  • 序号:5002

和这个:

  • 行动:FinalNativeSys
  • 健康)状况:
  • 序号:5001

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

于 2012-02-07T17:40:00.427 回答
0

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

于 2015-10-08T12:25:09.747 回答