在Windows安装程序提交中运行batch file

我没有成功修改Windows安装程序MSI在主输出安装后运行batch file。 我已经find了这个,发现了很多build议,但没有任何工作。

添加自定义操作
自定义操作只能是可执行文件。 batch file不可执行。

创build一个运行该batch file的Windows脚本宿主可执行文件
很多人都试图做到这一点,包括在SO上 ,没有人能够得到这个工作。

使用WIX或InstallShield
我没有时间或权限来改变公司的安装技术。

用Orca编辑.msi并添加一个自定义属性,然后自定义动作,然后编辑InstallExecuteSequence,…
我一直在尝试这个小时,只有创build安装程序,当我运行它们会引发系统错误。

你上面说的是不正确的:

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

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

更新 :为我工作的一个例子:(在CustomAction表中输入)

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

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

 System.Diagnostics.Process.Start(pathToBatchFile); 

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

虽然“威廉·莱拉”提出的答案是一个非常好的开始,但我在这里找到了一个更好的解决方案,值得一提。

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

一些注意事项:

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

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

第一个动作(类型50)在Source中执行命令,输入参数为Target,因为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导入Fixup.reg太。 最后一个可以使用msitran在这里建立一个后期构建自动化程序。

做一个EXE,使一个临时的.bat文件改变到你想要的任何目录,并CALL另一个bat文件,做你所需要的。

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

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

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