可以在cmd中启动多个命令的线程?

我有大约290个文件需要在短时间内优化。

当我做optipng *.png大概需要10分钟才能完成交易。

但是,当我在两个单独的命令行中optipng a*.pngoptipng m*.png命令时,它将在5分钟内完成工作。

现在有一种方法可以同时启动大约20个进程,这样可以更快地完成工作,而不占用桌面上的所有空间。

我已经编写了一个批处理文件,它只执行最大数量的命令: 并行执行shell进程 :

 @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 ..." )的进程来过滤任务tasklist /fi "windowtitle eq ..." 。 这应该工作相当可靠,并防止太多的误报。 如果您仍然有一些实例正在运行,那么搜索cmd.exe将是一个坏主意,因为这会限制您的工作进程池。

您可以使用%NUMBER_OF_PROCESSORS%来创建产生多少实例的合理默认值。

你也可以很容易地使用这个方法来使用psexec远程产生进程(但是由于你必须在另一台机器上拥有管理员权限以及在批处理中提供密码,所以不会非常可行)。 不过,您必须使用进程名称进行筛选。

看起来你可以写一个批处理文件,并从该文件异步运行你的命令。

异步运行Windows批处理文件命令