如何在安装过程中运行".bat"文件?

mam*_*ius 31 installation custom-action batch-file setup-project visual-studio-2008

在安装项目中,可以接受".exe,.dll,.js,.vbs"等可执行文件,但无法.bat在自定义操作中运行文件.

问题是如何*.bat在安装过程中运行文件?

Bri*_*ahy 59

好吧,经过大量的搜索和反复试验,我已经解决了这个问题.我不确定这是不是最好的方法,但它确实有效.

这是场景:我想通过Visual Studio安装项目部署一个应用程序.除了我的应用程序文件,我想在目标目录中创建一个包含批处理(.bat)文件的子目录.我希望这个文件在安装过程结束时运行.

这是你做的:

  1. 创建一个安装项目并按照惯例进行配置,包括放置批处理文件的子目录(如果不希望它放在子目录中,可以直接将它放在Application Folder中).
  2. 在"文件系统"视图中(右键单击解决方案资源管理器 - >视图 - >文件系统中的项目),添加要执行的批处理文件 cmd.exe(C:\ Windows\System32\cmd.exe)
  3. 打开"自定义操作"视图(在解决方案资源管理器 - >视图 - >自定义操作中右键单击项目)
  4. 右键单击"提交",然后选择"添加自定义操作"
  5. 导航到并选择cmd.exe.
  6. 打开新创建的自定义操作的属性面板.
  7. 从Arguments属性中删除/提交.
  8. /c "[TARGETDIR]subdirectoryname\batchfile.bat"在Arguments属性中输入:where子目录名应该替换为子目录的名称(如果你将批处理文件放在像我这样的子目录中......如果你没有,那么值应该是/c "[TARGETDIR]batchfile.bat")和batchfile.bat应该是批处理文件的文件名.

而已.现在,一旦完成其余的安装过程,就会执行批处理文件.

以下是为清晰起见的示例:

我的批处理文件: blah.bat
我的子目录:mydir

然后,我的自定义操作目标cmd.exe的参数值将是

/c "[TARGETDIR]mydir\blah.bat"

希望有人帮助!

  • 作为附录,我发现运行打包的cmd.exe(而不是System32目录中的cmd.exe)会将所有错误消息从信息性语句转换为"系统找不到消息号0x8的消息文本"之类的内容.为了解决这个问题,您可以(如果您确定目标计算机上的System32中将存在cmd.exe)使用`/ c cmd.exe/c"TARGETDIR] subirectoryname\batchfile.bat"`.这将导致打包的cmd.exe调用目标计算机上的本机cmd.exe,这将提供正确的错误消息. (6认同)

Y P*_*Y P 5

  1. 检查本文(不推荐使用该文章),即使该文章在VB.NET中也适用于C#。最重要的部分是(转换为C#)创建一个新的类库,并添加一个具有以下内容的新的Installer类:如本文所述,您可以随后引用刚刚创建的项目来创建新的自定义操作。

    override void Commit(IDictionary savedState)
    {
         base.Commit(savedState);
         System.Diagnostics.Process.Start("myApp.bat","your bat arguments");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在,我们将批处理文件添加到您的安装程序项目中。创建一个安装项目并按照通常的方式进行配置,包括放置批处理文件的子目录(如果不希望将其放置在子目录中,则可以直接将其放置在“应用程序文件夹”中)。

  3. 在“文件系统”视图中(在“解决方案资源管理器”->“视图”->“文件系统”中右键单击项目),添加要执行的批处理文件。

  4. 生成安装程序项目。


小智 5

另一种达到相同结果的方法是将.vbs文件放在运行相应.bat文件的自定义操作中.以下代码是我放入安装应用程序文件夹中的"RunRegisterComponents.vbs".当然我在Visual Studio属性窗口中将[TARGETDIR]作为.vbs参数.

dim WshShell
Set WshShell = CreateObject("WScript.Shell")

' Read the "CustomActionData" property holding the install directory.
dim programDir
programDir=  property("CustomActionData")

' Make the batch full file name and parameter
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) &
programDir& chr(34)

' Set the current directory
WshShell.CurrentDirectory = programDir

' Run batch.
ret = WshShell.Run (commandString, 0, 0)
Run Code Online (Sandbox Code Playgroud)

就像我设置自定义操作一样:

在此输入图像描述

我希望这可以帮到你!

  • 我正在使用这种方法,但我收到一条错误消息,并显示以下消息:“无法运行此安装所需的脚本” 以前有人遇到过这个问题吗? (2认同)