2011-01-29 15 views
4

短期間で最適化する必要があるファイルは約290個です。cmdで複数のコマンドスレッドを起動できますか?

optipng *.pngとすると、取引を完了するまでに約10分かかります。

しかし、optipng a*.pngoptipng m*.pngを2つの別々のコマンドラインで実行すると、5分で作業が完了します。

これで、約20個のプロセスを同時に起動する方法はありますが、これは作業を高速化し、デスクトップ上のすべての領域を占めることはありませんか?

答えて

2

私はしばらく前に、コマンドの唯一の最大数を実行するバッチファイルを書いた:それは、並列に実行する4つの新しいプロセスの最大を生成します

@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 

Parallel execution of shell processesを最小化されました。待ち時間は、各プロセスの処理量と実行時間に応じて調整する必要があります。おそらく、あなたが何か他のことをしている場合、タスクリストが探しているプロセス名を調整する必要もあります。

このバッチによって生成されたプロセスを適切にカウントする方法はありません。 1つの方法は、バッチ開始時に乱数を作成し(%RANDOM%)、処理を行う(または処理プログラムを生成する)がウィンドウタイトルをパラメータに設定できるヘルパーバッチを作成することです:

@echo off 
title %1 
"%2" "%3" 

これは、タイトルを最初のパラメータに設定し、3番目の引数を指定して2番目のパラメータを実行する単純なバッチです。指定したウィンドウタイトル(tasklist /fi "windowtitle eq ...")を持つプロセスだけを選択して、タスクリストをフィルタリングできます。これはかなり信頼性が高く、あまりにも多くの誤検出を防ぎます。 cmd.exeを検索すると、実行中のインスタンスがまだ残っていると悪い考えです。これはワーカープロセスのプールを制限するためです。

%NUMBER_OF_PROCESSORS%を使用すると、いくつのインスタンスを生成するかの分かりやすいデフォルトを作成できます。

psexecを使用すると、リモートからプロセスを起動できます(ただし、他のマシンで管理者権限を持ち、バッチでパスワードを入力する必要があります)。ただし、フィルタリングにプロセス名を使用する必要があります。

+0

非常に良い!このトリックをありがとうございました – Benoit

関連する問題