说,如果我有
如何异步运行批处理文件中的所有文件,即无需等待以前的程序停止?
答案 0 :(得分:232)
使用START
命令运行每个程序应该可以满足您的需求:
START "title" [/D path] [options] "command" [parameters]
每个START
调用都会运行其参数中给出的命令并立即返回,除非使用/WAIT
开关执行。
这适用于命令行应用程序。没有命令行的应用程序无论如何都会立即返回,所以可以肯定的是,如果要异步运行所有应用程序,请使用START
。
答案 1 :(得分:62)
结合以前的几个答案,您可以尝试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
答案 2 :(得分:35)
您可以使用start命令生成后台进程,而无需启动新窗口:
start /b foo.exe
使用CTRL-C不会中断新进程;你只能用CTRL-BREAK(或通过关闭窗口,或通过任务管理器)来杀死它。)
答案 3 :(得分:21)
答案 4 :(得分:16)
start [programPath]
如果程序的路径包含空格,请记得添加引号。在这种情况下,您还需要为打开控制台窗口提供标题
start "[title]" "[program path]"
如果你需要提供参数,请在末尾添加它们(在命令引号之外)
start "[title]" "[program path]" [list of command args]
使用/ b选项可以避免打开新的控制台窗口(但在这种情况下,您无法使用CTRL-C中断应用程序
答案 5 :(得分:10)
还有第三种(可能更容易)的选择。如果你想要启动单个程序的多个实例,使用像Xargs或GNU Parallel这样的Unix式命令处理器可以使这个过程相当简单。
有一个名为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的输入中。
答案 6 :(得分:-1)
我什么都做不了,我最终只是使用powershell来启动bat脚本。 >
start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden