如何在并行运行多个文件时在后台运行批处理文件
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
和你的批处理文件。 Call
像 Start
都是 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 =""
等待相关句柄关闭。
【讨论】:
以上是关于如何在并行运行多个文件时在后台运行批处理文件的主要内容,如果未能解决你的问题,请参考以下文章