异步运行Windows批处理文件命令

说,如果我有

  • foo.exe
  • bar.exe
  • baz.exe

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

300416 次浏览

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

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

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

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

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

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

启动命令在一个新窗口中运行你的命令,所以所有3个命令都将异步运行。

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

start /b foo.exe

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

结合前面的几个答案,你可以尝试start /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

还有第三种选择(可能简单得多)。如果希望启动单个程序的多个实例,使用Xargs或GNU Parallel等unix风格的命令处理器可以使这个过程相当简单。

有一个win32 Xargs克隆名为PPX2,它使这个相当简单。

例如,如果你想对一个视频文件目录进行代码转换,你可以运行以下命令:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

拆开来看,dir /b *.mpg获取当前目录中的.mpg文件列表,|操作符将该列表输送到ppx2,然后构建一系列要并行执行的命令;每次4个,由-P 4操作符指定。-L 1操作符告诉ppx2一次只将目录列表中的一行发送到ffmpeg。

在此之后,只需编写命令行(ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"), {}将自动替换为目录列表中的每一行。

它并不是适用于所有情况,但比使用上面详细介绍的批处理文件的变通方法要容易得多。当然,如果不处理文件列表,也可以将文本文件或任何其他程序的内容管道到pxx2的输入中。

使用启动命令:

start [programPath]

如果程序的路径包含空格,请记住添加引号。在这种情况下,您还需要为打开的控制台窗口提供一个标题

start "[title]" "[program path]"

如果需要提供参数,则将它们附加在末尾(在命令引号之外)

start "[title]" "[program path]" [list of command args]

使用/b选项避免打开新的控制台窗口(但在这种情况下,不能使用CTRL-C中断应用程序

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

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