说,如果我有

foo.exe bar.exe baz.exe

我如何从批处理文件异步运行它们,即不等待前一个程序停止?


当前回答

我不能得到任何工作,我最终只是使用powershell启动bat脚本..有时甚至启动CMD /c不工作不知道为什么..我甚至尝试了像启动cmd /c notepad &退出这样的东西

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden

其他回答

使用START命令运行每个程序应该会得到你所需要的:

START "title" [/D path] [options] "command" [parameters]

每个START调用都运行其参数中给定的命令并立即返回,除非使用/WAIT开关执行。

这适用于命令行应用程序。没有命令行的应用程序无论如何都会立即返回,所以为了确保,如果你想要异步运行,请使用START。

我不能得到任何工作,我最终只是使用powershell启动bat脚本..有时甚至启动CMD /c不工作不知道为什么..我甚至尝试了像启动cmd /c notepad &退出这样的东西

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden

你可以使用start命令在不启动新窗口的情况下生成后台进程:

启动/b foo.exe

新进程将不可用CTRL-C中断;你只能用CTRL-BREAK(或通过关闭窗口,或通过任务管理器)杀死它。

结合前面的几个答案,您可以尝试启动/b cmd /c foo.exe。

举个简单的例子,如果你想打印出java/groovy/grails/gradle的版本,你可以在批处理文件中完成:

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

如果您有类似进程资源管理器(Sysinternals)的程序,您将看到一些子cmd.exe进程,每个子进程都带有一个java进程(根据上述命令)。输出将以它们完成的任何顺序打印到屏幕上。

start /b :  Start application without creating a new window. The
             application has ^C handling ignored. Unless the application
             enables ^C processing, ^Break is the only way to interrupt
             the application

cmd /c : Carries out the command specified by string and then terminates

用下面的代码创建一个批处理文件:

start foo.exe
start bar.exe
start baz.exe 

start命令在一个新窗口中运行您的命令,因此所有3个命令都将异步运行。