【问题标题】:Possible to launch multiple threads of commands in cmd?可以在cmd中启动多个命令线程吗?
【发布时间】:2026-02-17 11:00:01
【问题描述】:
我有大约 290 个文件需要在短时间内优化。
当我做optipng *.png时,大约需要10分钟才能完成交易。
但是,当我在两个单独的命令行中执行 optipng a*.png 和 optipng m*.png 时,它可以在 5 分钟内完成工作。
现在有没有一种方法可以让我同时启动大约 20 个进程,这样可以更快地完成工作并且不会占用我桌面上的所有空间?
【问题讨论】:
标签:
windows
cmd
multiprocessing
【解决方案1】:
前段时间我写了一个只执行最大命令数的批处理文件:Parallel execution of shell processes:
@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof
:loop
call :checkinstances
if %INSTANCES% LSS 5 (
rem just a dummy program that waits instead of doing useful stuff
rem but suffices for now
echo Starting processing instance for %1
start /min wait.exe 5 sec
goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof
:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l`) do set INSTANCES=%%t
goto :eof
它产生最多四个并行执行并最小化的新进程。等待时间可能需要调整,具体取决于每个进程的执行量和运行时间。如果您正在执行其他操作,您可能还需要调整任务列表正在查找的进程名称。
但是,无法正确计算此批次产生的进程。一种方法是在批处理开始时创建一个随机数 (%RANDOM%) 并创建一个辅助批处理来执行处理(或生成处理程序),但可以将其窗口标题设置为参数:
@echo off
title %1
"%2" "%3"
这将是一个简单的批处理,它将其标题设置为第一个参数,然后以第三个参数作为参数运行第二个参数。然后,您可以通过仅选择具有指定窗口标题 (tasklist /fi "windowtitle eq ...") 的进程来过滤任务列表。这应该工作相当可靠,并防止太多误报。如果您仍有一些实例正在运行,那么搜索 cmd.exe 将不是一个好主意,因为这会限制您的工作进程池。
您可以使用%NUMBER_OF_PROCESSORS% 来创建一个合理的默认值来生成多少个实例。
您也可以轻松地调整它以使用psexec 远程生成进程(但由于您必须在另一台机器上拥有管理员权限并在批处理中提供密码,所以不太可行)。但是,您必须使用进程名称进行过滤。