如何在并行运行多个文件时在后台运行批处理文件

Posted

技术标签:

【中文标题】如何在并行运行多个文件时在后台运行批处理文件【英文标题】:How to run batch files in background while running multiple files in parallel 【发布时间】:2021-07-05 12:03:03 【问题描述】:

我正在编写一个批处理文件,它将并行执行其他 4 个批处理文件:

@echo off

echo %time%

(
    start call s1.bat
    start call s2.bat
    start call s3.bat
    start call s4.bat
) | set /P "="

echo %time%

但这会打开 4 个新窗口。 谁能帮忙,如何避免打开多个窗口并在后台运行所有这 4 个批处理文件?

添加/B 是一个选项,但我不知道在哪里添加它。

(
    start /B call s1.bat
    start /B call s2.bat
    start /B call s3.bat
    start /B call s4.bat
) | set /P "="

给我一​​个错误:

The process tried to write to a nonexistent pipe.

由于我不想使用VB或任何其他脚本,如何批量执行?

【问题讨论】:

如果不使用 VBscript 或其他第三方实用程序,您将无法隐藏批处理文件窗口。您将得到的最好的结果是使用START 命令最小化选项。 另外,你会 start cmd.exe 使用参数 /D /C Call 和你的批处理文件。 CallStart 都是 cmd.exe 内部的。 如何使用 /B 的 start ?它说,启动应用程序而不创建新窗口。 我没有得到你的第二点。所以我应该只使用 start ? 创建一些测试批处理文件来做一些简单的事情,也许是@Echo %TIME% > "%~n0.log",然后尝试一下。但是,您将无法在没有 cmd.exe 窗口显示的情况下运行批处理文件,即使只有几分之一秒,您最好的希望是使用 Start/Min 选项,(你已经被告知),即使那样你也会看到它“闪烁”。如果你想隐藏运行它,你需要使用 Windows Scripting Host,(或其他类似的实用程序),或者从 Window Task Scheduler 以 SYSTEM 运行它。 【参考方案1】:

这是一个非常有趣的问题!好像重定向句柄有些冲突。

主脚本等待使用以下代码执行子脚本(在 Windows 10 上):

(
    > nul start "" /B cmd /D /C call s1.bat
    > nul start "" /B cmd /D /C call s2.bat
    > nul start "" /B cmd /D /C call s3.bat
    > nul start "" /B cmd /D /C call s4.bat
) | set /P =""

> nul 重定向可防止将任何数据写入管道 |。似乎只要有任何内容写入标准输出句柄 STDOUT (1),主脚本就不再等待(有时会出现错误消息 The process tried to write to a nonexistent pipe.,可能取决于如何快速执行子脚本)。但是,一旦/B 被删除,子脚本输出到STDOUT 不会影响主脚本的行为,它等待所有子脚本,> nul 是因此不再需要。

显式的cmd /C 部分是必要的,因为start 在启动像call 这样的内部命令时会隐式使用cmd /K,这会在完成相应的子脚本后留下未终止的进程cmd.exe/D 开关只是防止执行任何自动运行命令。


当您使用普通start 而不使用/B 运行子脚本时,将启动命令解释器的新实例,即进程cmd.exe,并启动控制台窗口的新实例一个进程conhost.exe

现在使用start /B 仍会创建一个新进程cmd.exe,但它使用当前 进程conhost.exe

我不知道后台到底发生了什么以及所有这些进程如何交互,但在我看来,问题与使用 start /B 时缺少 conhost.exe 进程有关。也许conhost.exe 正在建立重定向句柄,从而建立管道。不管怎样,只要管道没有写入任何内容,就没有什么冲突,所以set /P =""等待相关句柄关闭。

【讨论】:

以上是关于如何在并行运行多个文件时在后台运行批处理文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让这个Bat批处理文件在后台运行?不用vbs

在多个数据库上并行运行 Spring Batch

在启动时运行批处理文件

如何使批处理BAT文件在后台运行而不显示DOS窗口

如何在批处理模式下运行存储过程或在并行处理中运行它

多进程概念