【发布时间】:2010-11-29 18:27:47
【问题描述】:
说,如果我有
- foo.exe
- bar.exe
- baz.exe
如何从批处理文件中异步运行所有这些,即不等待前一个程序停止?
【问题讨论】:
标签: batch-file cmd
说,如果我有
如何从批处理文件中异步运行所有这些,即不等待前一个程序停止?
【问题讨论】:
标签: batch-file cmd
使用START 命令运行每个程序应该可以满足您的需要:
START "title" [/D path] [options] "command" [parameters]
每个START 调用都会运行其参数中给出的命令并立即返回,除非使用/WAIT 开关执行。
这适用于命令行应用程序。无论如何,没有命令行的应用程序会立即返回,所以可以肯定的是,如果你想异步运行,请使用START。
【讨论】:
help 的每个条目。 :)
使用以下行创建一个批处理文件:
start foo.exe
start bar.exe
start baz.exe
start command 在新窗口中运行您的命令,因此所有 3 个命令都将异步运行。
【讨论】:
您可以使用 start 命令在不启动新窗口的情况下生成后台进程:
start /b foo.exe
新进程不会被 CTRL-C 中断;您只能使用 CTRL-BREAK(或通过关闭窗口,或通过任务管理器)杀死它。
【讨论】:
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
如果你有类似 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
【讨论】:
echo off,当您执行脚本时,它将阻止所有命令回显到控制台。 @ 类似,但仅针对该单个命令。所以,有时你会看到@echo off。
还有第三种(可能更容易)选项。如果你想启动单个程序的多个实例,使用像 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 的输入中。
【讨论】:
start [programPath]
如果程序的路径包含空格,请记住添加引号。在这种情况下,您还需要为打开的控制台窗口提供标题
start "[title]" "[program path]"
如果您需要提供参数,请将它们附加在末尾(在命令引号之外)
start "[title]" "[program path]" [list of command args]
使用 /b 选项避免打开新的控制台窗口(但在这种情况下,您不能使用 CTRL-C 中断应用程序
【讨论】:
我什么也做不了,最后我只使用了 powershell 来启动 bat 脚本.. 有时甚至 start cmd /c 也不知道为什么.. 我什至尝试了 start cmd /c notepad & exit 之类的东西
start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
【讨论】: