2010-08-25 30 views
2

我有4個.cmd文件。我想一次運行2次。 說我的文件是:1.cmd,2.cmd,3.cmd,4.cmd如何並行運行幾個.cmd文件

我想並行運行1.cmd和2.cmd。現在,當這些結束時,我想運行3.cmd,然後4.cmd。總之,在任何給定的時間我想要運行2個.cmd文件。

我正在使用Start命令進行並行執行。但我對腳本不熟悉,對於如何修改上述運行cmd文件的方式感到困惑。

任何幫助,將不勝感激。

感謝 Debjani

回答

1

我已經給了一個答案「Parallel execution of shell processes」一次,引用在這裏:

聽起來更像是要使用 Powershell 2.但是,您可以使用start產生 新窗口(或其他進程) ,另請參閱此 回答。儘管您可能需要使用其他一些工具和小小的 來創建類似於「進程池」的 (一次只能運行最多 的實例)。 您可以通過使用 tasklist /im和計數許多 如何已經在那裏(for環或wc, 如適用),並簡單地等待(ping -n 2 ::1 >nul 2>&1)實現後者並重新檢查是否可以產生一個新的 過程。立即

@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 

回報;:

我已經拼湊一個小測試 批次此 REM否則只是使用一個未使用的地址和-n 1) echo等待實例關閉... ping -n 2 :: 1> nul 2> rem跳回去看看我們是否可以產生一個新的流程現在 轉到循環 轉到:EOF

:checkinstances 
rem this could probably be done better. But INSTANCES should contain 

運行實例 後來的數量。 FOR/F 「有usebackq」 %%噸(tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l)不要設置 INSTANCES = %%噸 轉到:EOF

它產生一個最大的是並行執行和 最小化四個新 過程。等待時間需要調整爲 ,具體取決於每個過程如何執行以及運行多長時間 。您可能還需要 調整進程名稱,其中 任務列表正在查找,如果您正在執行 其他操作。

儘管如此,沒有辦法正確計數 批處理產生的 進程。一種方法是 在 開始時的分批(%RANDOM%)創建一個隨機數,並創建一個 幫助一批,做加工 (或派生的處理程序),但 可以設置其窗口標題爲 參數:

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

這將是一個簡單的批處理,設置 其標題於第一參數和 然後運行與 第三作爲參數的第二參數。然後您可以通過 標題(tasklist /fi "windowtitle eq ...")指定的窗口 進程在任務列表中篩選 標題(tasklist /fi "windowtitle eq ...")。這應該相當可靠地工作,並防止太多錯誤 積極。搜索cmd.exe 如果仍有 某些實例正在運行,那麼這將是一個糟糕的主意,因爲這會限制 您的工作進程池。

您可以使用%NUMBER_OF_PROCESSORS% 創建多個實例產生的合理默認值。

你也可以很容易地適應這種使用 psexec產卵的過程 遠程(但不會是非常可行的 因爲你必須在另一臺機器上擁有管理權限的 以及 在提供密碼批量)。 但是,您必須使用進程名稱 進行過濾。