异步运行 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 命令