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

Posted

技术标签:

【中文标题】异步运行 Windows 批处理文件命令【英文标题】:Running Windows batch file commands asynchronously 【发布时间】:2010-11-29 18:27:47 【问题描述】:

说,如果我有

foo.exe bar.exe baz.exe

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

好的,谢谢。我应该仔细阅读help 的每个条目。 :) 无耻的自我宣传:我曾经创建了一个批处理,它可以用作某种线程池,仅用于进程:***.com/questions/672719/… 如果您需要提供参数或者命令的路径包含空格,请记得添加引号。在这种情况下,您还需要为打开的控制台窗口提供标题: start "" "[path to command]" [command args] “没有命令行的应用程序会立即返回” – 你确定吗? Why GUI application blocks a batch file?【参考方案2】:

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

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

start command 在新窗口中运行您的命令,因此所有 3 个命令都将异步运行。

【讨论】:

只要你没有带空格的路径就可以工作。然后当你在它周围加上双引号时,它会考虑标题,而不是应用程序。这行得通。 START "VMPlayer" /D "C:\Users\gavin\Virtual Machines\CentOS 8 64-bit" "C:\Program Files (x86)\VMware\VMware Player\vmplayer.exe"【参考方案3】:

您可以使用 start 命令在不启动新窗口的情况下生成后台进程:

start /b foo.exe

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

【讨论】:

如今BREAK 在键盘上的位置在哪里? @user2023370 仍在Pause 键上。大多数缺少某些键的笔记本电脑都支持hidden key combinations。 @user2023370 Pause/Break key on modern keyboards en.wikipedia.org/wiki/Break_key#Modern_keyboards 对我不起作用。仍然停止等待应用程序关闭,然后再继续。【参考方案4】:

结合之前的几个答案,您可以尝试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 对我不起作用。仍然停止等待应用程序关闭,然后再继续。【参考方案5】:

还有第三种(可能更容易)选项。如果你想启动单个程序的多个实例,使用像 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 的输入中。

【讨论】:

最新的 xargs win32 端口现在运行良好(无论如何都包含在 git for windows 中)。 这很好,只是它无法处理包含 unicode 字符的文件。有支持 unicode 文件的计划吗?谢谢。 @GökhanSever 在过去,我通过使用路径的“短名称”形式来解决这个问题,它看起来像 C:\PROGRA~1\WINDOW~3\MYPROG~1。 EXE文件。不漂亮,但很管用。【参考方案6】:

使用START command:

start [programPath]

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

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

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

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

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

【讨论】:

【参考方案7】:

我什么也做不了,最后我只使用了 powershell 来启动 bat 脚本.. 有时甚至 start cmd /c 也不知道为什么.. 我什至尝试了 start cmd /c notepad & exit 之类的东西

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden

【讨论】:

以上是关于异步运行 Windows 批处理文件命令的主要内容,如果未能解决你的问题,请参考以下文章

从 DOS/Windows 批处理文件运行 Sybase SQL 命令

Windows下使用批处理命令运行当前目录下的Jar文件

如何利用批处理命令让两个WINDOWS程序按照顺序运行?

重定向 Windows 批处理文件命令的回显

Python 和 Windows 10:“telnet”未被识别为内部或外部命令、可运行程序或批处理文件

window10,ssh不是内部或外部命令,也不是可运行的程序 或批处理文件?