运行多个并发后台进程,然后等待所有这些进程在Windows上终止


12

有人知道是否有cmd脚本可以执行此操作和/或命令行工具为该作业做好准备了吗?


这样做会损害您的数据!
Santosh Kumar

8
@Santosh:“你的数据会受到损害”是什么意思?在我的具体情况下,后台任务将处理它们自己的独立数据集。没有并发修改的风险。
塞尔吉奥

1
从Win32 API方面来看,我认为 使用bWaitAll = TRUE的WaitForMultipleObjects可以完成这项工作。如果没有令人满意的答案,那么编写一个只是在一些输入文件中提供程序的程序并不难。
grawity

1
@grawity:是的,我打算这样做,如果什么都没有出现(并在这里发布代码),但让我们看看我是否可以避免重新发明轮子:)
Sergio

如果现有的车轮是方形的,重新发明轮子是一件好事...
12

Answers:


8

在下面创建三个批处理文件。Main.bat启动1.bat和2.bat

1.bat和2.bat写出main.bat检查的临时文件。当1.bat和2.bat工作时,main.bat报告仍然在进行处理。当您在1.bat或2.bat的打开窗口中按Enter键时,将删除临时文件,并退出程序。这模拟了该.bat文件的处理停止。如果对1和2.bat执行此操作,main.bat会向您报告已完成这些进程的处理。只要在完成后清除临时文件,就可以使1.bat和2.bat做任何你想做的事情。此时,main.bat可以执行您希望它执行的任何操作。

1.BAT

echo %time% > 1.tmp
pause
del 1.tmp
exit 

2.bat

echo %time% > 2.tmp
pause
del 2.tmp
exit

main.bat

@echo off
start "1" 1.bat
start "2" 2.bat
    @ping -n 1 127.0.0.1 > nul
:loop
@echo Processing......
if not exist *.tmp goto :next
    @ping -n 5 127.0.0.1 > nul
goto loop
:next
@echo Done Processing!

在此之前完成此操作后,我可以告诉您这种方法并不像看起来那么难。此外,易于维护 - 扩展和添加逻辑,并且易于培训其他人来维护它。通常这些事情会占据他们自己的生命......
RobW

我很满意这个解决方案。
user1068446 2013年

3

如果过程不需要标准输入或输出,则足够简单。从命令行或批处理文件中:

process1 | process2 | process3 | process4

这将同时运行所有四个进程,并且在它们全部退出之前不会返回。(可能的例外:如果进程显式关闭标准输出,则可能会将其视为已退出。但这是不寻常的,很少有进程执行此操作。)

我不确定你可以用这种方式同时启动多少个进程。我已经尝试了十次。


嗯,我得到的是所有进程确实立即启动,但进程3一直等到进程4完成,进程2一直等到进程3完成,依此类推。顺便说一下,这是来自经典的Windows命令提示符。
塞尔吉奥

@Sergio:“等待”是什么意思?
哈利约翰斯顿

1

执行此操作的唯一方法是启动start /?运行单个任务的单独批处理文件(请参阅参考资料),并在完成时写入文本文件。然后,您定期检查是否已创建文本文件。


0

您可以查看Powershell Start-Job cmdlet。它应该允许你这样做。更多这里 Powershell是微软的首选外壳。它比cmd脚本更强大,并且很好地投入了你的时间


这不等待所有人终止?
Tamara Wijsman

它当然可以取决于你如何写它。您可以轮询已启动的作业,以查看它们是否已完成并退出脚本。该页面上的代码处理整个作业列表,一次三个,等待它们退出。
uSlackr

嗯,以前从未对Powershell做过任何事情。我试图更改示例以运行任意进程并等待它们完成,在M $ technet上大约30分钟和100次查找后,我放弃了。我很抱歉,如果我伤害了任何人的感情,但Powershell是废话。在C中这样做更容易(我认为这是在说明......)无论如何,我打赌有人会发现这个有用。
Sergio

如果有一件事,Powershell不是废话,如果你不使用它,你不会伤​​害我的感情。但是,你不会在30分钟的搜索中学到它。
uSlackr

1
PowerShell不是废话,它只是一个必须学习的完整编程语言,而不是传统的类似sh的语法。我记得我对Perl,Python,Tcl,C#以及我试图学习的所有其他语言都有同样的看法,而没有任何实际用途。(当我真的需要它们时,它相当容易。)
grawity

0

或者你可以使用这个:http//www.out-web.net/?p = 167

我做到了,它有效,但有时会发生完成过程的PID立即被另一个刚启动的Windows进程重新使用,并且它会检测到您的进程的结尾是危险的/错误的。


1
请总结一下这个链接说的内容。如果页面出现故障,此答案将无济于事。
Kevin Panko 2014年

0

我也在寻找类似的任务。目标是并行运行多个命令并提取所有并行进程的输出(stdout和错误)。然后等待所有并行进程完成并执行另一个命令。以下是BAT文件的示例代码,可以在CMD中执行:

( start "" /B cmd /c ping localhost -n 6 ^>nul timeout /t 5 /nobreak start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1 start "" /B cmd /c ping localhost -n 11 ^>nul timeout /t 10 /nobreak ) | pause Echo waited timeout /t 12 /nobreak

()首先执行里面的所有语句,等待它们完成,然后执行最后两行。所有开始的命令start都是同时执行的。

这些链接很有用:https//stackoverflow.com/a/43762349/9689416https://ss64.com/nt/start.html

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.