2011-01-29 290 views
4

我有大約290個文件需要在短時間內優化。可能在cmd中啓動多個命令線程?

當我做optipng *.png大約需要10分鐘完成交易。

但是,當我在兩個單獨的命令行中執行optipng a*.pngoptipng m*.png時,它將在5分鐘內完成工作。

現在有一種方法可以同時啓動約20個進程,這將使工作更快完成,而不會佔用桌面上的所有空間?

回答

2

我寫了執行命令的,而以前只有最大數量的批處理文件: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來遠程產生進程(但不會非常可行,因爲你必須在另一臺機器上擁有管理員權限並且在批處理中提供密碼)。不過,您必須使用流程名稱進行過濾。

+0

非常好!這個技巧非常感謝你 – Benoit 2011-02-24 08:20:52