asynchronous运行Windowsbatch file命令
说,如果我有
- foo.exe的
- bar.exe
- baz.exe
我如何从一个batch file中asynchronous运行它们,即不等待之前的程序停止?
使用START
命令来运行每个程序应该会得到你所需要的:
START "title" [/D path] [options] "command" [parameters]
每个START
调用运行参数中给出的命令,并立即返回,除非用/WAIT
开关执行。
这适用于命令行应用程序。 没有命令行的应用程序无论如何都会立即返回,因此,如果要asynchronous运行所有应用程序,请使用START
。
结合前面几个答案,你可以尝试start /b cmd /c foo.exe
。
对于一个简单的例子,如果你想打印出java / groovy / grails / gradle的版本,你可以在一个batch file中做到这一点:
@start /b cmd /c java -version @start /b cmd /c gradle -version @start /b cmd /c groovy -version @start /b cmd /c grails -version
如果你有像Process Explorer(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命令来产生后台进程而不用启动新的窗口:
start /b foo.exe
CTRL-C不会中断新进程; 您只能通过CTRL-BREAK(或通过closures窗口或通过任务pipe理器)来杀死它。
使用以下几行创build一个batch file:
start foo.exe start bar.exe start baz.exe
start命令在新窗口中运行您的命令,所以所有3个命令将asynchronous运行。
使用START命令 :
start [programPath]
如果程序的path包含空格,请记住添加引号。 在这种情况下,您还需要提供打开控制台窗口的标题
start "[title]" "[program path]"
如果你需要提供参数在最后(在命令引号之外)
start "[title]" "[program path]" [list of command args]
使用/ b选项可避免打开新的控制台窗口(但在这种情况下,您不能使用CTRL-C中断应用程序
还有第三个(也可能更容易)选项。 如果你想旋转一个程序的多个实例,使用像Xargs或者GNU Parallel这样的Unix风格的命令处理器可以使这个过程非常简单。
有一个名为PPX2的win32 Xargs克隆使得这个过程非常简单。
例如,如果您想转码video文件的目录,则可以运行以下命令:
dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
select这个分开, dir /b *.mpg
抓取.mpg文件列表在我的当前目录中, |
运算符将该列表pipe理到ppx2中,然后构build一系列并行执行的命令; 每次4个,这里由-P 4
操作员指定。 -L 1
运算符告诉ppx2一次只发送一行目录列表到ffmpeg。
之后,您只需编写命令行( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
),并且{}
会自动replace目录列表的每一行。
它不是普遍适用于每一种情况,但是比使用上面详述的batch file解决方法更容易一些。 当然,如果不处理文件列表,也可以将文本文件或任何其他程序的内容传送到pxx2的input中。