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

Ric*_*chN 180 cmd batch-file

说,如果我有

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

如何异步运行批处理文件中的所有这些,即无需等待以前的程序停止?

mac*_*die 249

使用该START命令运行每个程序应该可以满足您的需求:

START "title" [/D path] [options] "command" [parameters]
Run Code Online (Sandbox Code Playgroud)

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

这适用于命令行应用程序.没有命令行的应用程序无论如何都会立即返回,所以可以肯定的是,如果要以异步方式运行所有应用程序,请使用START.

  • 前几天我真的遇到了麻烦.我不得不启动30个浏览器窗口进行性能测试.没有工作,这对我来说是不够重要的..在那个窗口开始浏览,几个小时后我关闭它,另一个加速了!而我就像死了一样,关闭它......另一个加速了!经过4-5个窗口和很多****我发现批处理文件仍在运行! (8认同)
  • 如果需要提供参数或命令的路径包含空格,请记住添加引号.在这种情况下,您还需要为打开控制台窗口提供标题:start"""[path to command]"[command args] (4认同)
  • 无耻的自我宣传:我曾经创建了一个能够作为某种线程池运行的批处理,仅用于进程:http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667# 676667 (2认同)

djK*_*osh 65

结合以前的几个答案,你可以试试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
Run Code Online (Sandbox Code Playgroud)

如果您有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
Run Code Online (Sandbox Code Playgroud)

  • 它可以防止命令回显到控制台.在批处理脚本中,有时您会在开头看到`echo off`,当您执行脚本时,将阻止所有命令回显到控制台.`@`类似,但仅适用于那个单一命令.所以,有时你会看到`@echo off`. (13认同)

小智 35

您可以使用start命令生成后台进程,而无需启动新窗口:

start /b foo.exe

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

  • 这些天键盘上的"BREAK"在哪里? (4认同)

Nik*_*hil 22

使用以下行创建批处理文件:

start foo.exe
start bar.exe
start baz.exe 
Run Code Online (Sandbox Code Playgroud)

启动命令在新窗口中运行你的命令,让所有3个命令将异步运行.


Pie*_*igi 17

使用START命令:

start [programPath]
Run Code Online (Sandbox Code Playgroud)

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

start "[title]" "[program path]"
Run Code Online (Sandbox Code Playgroud)

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

start "[title]" "[program path]" [list of command args]
Run Code Online (Sandbox Code Playgroud)

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


sch*_*mod 10

还有第三种(可能更容易)的选择.如果你想要启动单个程序的多个实例,使用像Xargs或GNU Parallel这样的Unix风格的命令处理器可以使这个过程相当简单.

有一个叫做PPX2的win32 Xargs克隆,这使得它非常简单.

例如,如果要转换视频文件的目录,可以运行以下命令:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
Run Code Online (Sandbox Code Playgroud)

采摘此分开,dir /b *.mpg抓住在我的当前目录的.MPG文件的列表,该|运营商管该列表到PPX2,然后构建了一系列平行于要执行的命令; 一次4个,由-P 4操作员在此指定.该-L 1运营商告诉PPX2只发送我们的目录中的一个行上市在时间FFmpeg的.

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

它并非普遍适用于所有情况,但比使用上面详述的批处理文件解决方法要容易得多.当然,如果您不处理文件列表,您还可以将文本文件或任何其他程序的内容传递到pxx2的输入中.