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


186

说,如果我有

  • foo.exe
  • 可执行文件
  • 巴兹

如何从批处理文件异步运行所有这些文件,即不等待上一个程序停止运行?

Answers:


254

使用START命令运行每个程序应该可以为您提供所需的信息:

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

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

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


好的谢谢。我应该help仔细阅读每个条目。:)
RichN

8
前几天我确实遇到了麻烦。我必须启动30个资源管理器窗口以进行性能测试。没用,对我来说不够重要。.开始在该窗口中浏览,几个小时后,当我关闭它时,又弹出了!而我就像在死,把它关了..另一个弹出了!经过4-5个窗口以及很多****之后,我注意到批处理文件仍在运行!
乔纳斯·B

3
无耻的自我广告:我曾经创建了一个批处理程序,它可以用作某种线程池,仅用于进程:stackoverflow.com/questions/672719/…–
Joey

4
如果需要提供参数,或者命令路径中包含空格,请记住添加引号。在这种情况下,您还需要为打开的控制台窗口提供标题:start“”“ [[command的路径]” [command args]
Pierluigi 2014年

完成这项技术后,有什么方法可以告诉它吗?我将开始〜30份FILA DESTA的发布,并希望它们保持异步,但我也想对它们完成时有所了解。
Doug

68

结合之前的几个答案,您可以尝试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

如果您拥有诸如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

13
它可以防止命令回显到控制台。在批处理脚本中,有时您会echo off在开始时看到它,当您执行脚本时,它将阻止所有命令回显到控制台。该@是类似的,但只是针对单个命令。因此,有时您会看到@echo off
djKianoosh '16

36

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

start /b foo.exe

新进程将不会被CTRL-C中断;您只能使用CTRL-BREAK(或通过关闭窗口或通过任务管理器)将其杀死。


5
BREAK这些天键盘在哪里?
user2023370

1
@ user2023370仍在“ 暂停”键上。大多数缺少某些键的笔记本电脑都支持隐藏键组合
GeroldBroser


23

用以下几行创建一个批处理文件:

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

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


17

使用START命令

start [programPath]

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

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

如果需要提供参数,请在参数末尾附加这些参数(命令引号之外)

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

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


10

还有第三个(可能更简单)的选择。如果要启动单个程序的多个实例,则使用Unix风格的命令处理器(如Xargs或GNU Parallel)可以使该过程相当简单。

有一个名为PPX2的win32 Xargs克隆,这使其非常简单。

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

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的输入中。


1
如今,最新的xargs win32端口运行良好(无论如何,git附带的Windows版本)。
彼得M

这很好,除了它无法处理包含Unicode字符的文件。有计划支持unicode文件吗?谢谢。
格克汗Sever的

@GökhanSever过去,我通过使用路径的“短名称”形式来解决此问题,该形式类似于C:\ PROGRA〜1 \ WINDOW〜3 \ MYPROG〜1.EXE。不漂亮,但是可以。
熔融形式

-1

我什么都做不了,我最终只是使用powershell来启动bat脚本..有时甚至启动cmd / c也无法正常工作,不确定为什么..我什至尝试了诸如start cmd / c记事本&exit之类的东西

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.