2017-06-20 107 views
1

我發現很難在這裏修改腳本,以滿足我的要求: https://stackoverflow.com/a/12665498/4683898等待並行批處理腳本或命令行

@echo off 
setlocal 
set "lock=%temp%\wait%random%.lock" 

:: Launch one and two asynchronously, with stream 9 redirected to a lock file. 
:: The lock file will remain locked until the script ends. 
start "" cmd /c 9>"%lock%1" one.bat 
start "" cmd /c 9>"%lock%2" two.bat 

:Wait for both scripts to finish (wait until lock files are no longer locked) 
1>nul 2>nul ping /n 2 ::1 
for %%N in (1 2) do (
    (rem 
) 9>"%lock%%%N" || goto :Wait 
) 2>nul 

::delete the lock files 
del "%lock%*" 

:: Launch three and four asynchronously 
start "" cmd /c three.bat 
start "" cmd /c four.bat 

我使用批處理腳本,不執行進一步的批處理腳本,但只需執行cmd命令(運行一段時間)並行,並且與上面的腳本一起工作正常。

但是,我希望能夠同時運行多個命令/腳本,即3,4,5(或任何我想要的)命令,並行運行,我們稱之爲x。

所以,我想運行CMD命令的x量(即在平行執行),等待他們終止(使用/ C),然後執行所述一堆CMD命令的x量,然後下一個束,等等,直到所有cmd命令已經執行。

我該如何修改該腳本? (我已經做了幾次嘗試,儘管重複錯誤「進程無法訪問該文件,因爲它正在被另一個進程使用」,在啓動批處理腳本中;我推測這個文件是指鎖文件)

感謝

編輯:

@echo off 
setlocal 
set "lock=%temp%\wait%random%.lock" 

call :a start cmd.exe /c somecommandA 1 
call :a start cmd.exe /c somecommandB 2 
call :wait 
call :a start cmd.exe /c somecommandC 1 
call :a start cmd.exe /c somecommandD 2 
call :a start cmd.exe /c somecommandE 3 

exit /b 
:a 
start "%~2" cmd /c 9>"%lock%%2" %1 
exit /b 
:wait 
1>nul 2>nul ping /n 2 ::1 
for %%N in (%lock%*) do (
    (rem 
) 9>"%%N" || goto :Wait 
) 2>nul 

回答

1

你可以用這個腳本方便地調用文件:

@echo off 
setlocal 
set "lock=%temp%\wait%random%.lock" 


call :a one.bat 1 
call :a two.bat 2 
call :wait 
call :a three.bat 1 
call :a name.bat 2 
call :a gfwagwa.bat 3 


exit /b 
:a 
start "%~2" cmd /c 9>"%lock%%2" %1 
exit /b 
:wait 
1>nul 2>nul ping /n 2 ::1 
for %%N in (%lock%*) do (
    (rem 
) 9>"%%N" || goto :Wait 
) 2>nul 

call :wait簡單REPL等待。無論何時調用所有要異步運行的文件,都需要調用wait函數。然後你可以調用更多的腳本。

第二個參數是鎖定文件的編號。在所有使用它們的腳本都關閉之前,請確保沒有重複的數字(即在下一個call :wait之前)。儘管你不會用完數字,但沒有理由使用重複。

+0

謝謝。我得到同樣的錯誤「進程無法訪問文件,因爲它正在被另一個進程使用。」在啓動批處理腳本中。此外,不幸的是它不起作用 - 它只是打開命令提示符等待進一步的命令。請參考我上面原始帖子中的編輯,瞭解我目前的內容。任何其他想法? – 151SoBad

0

只是提供另一種方式:

@ECHO off 
start "MyCommand-%~n0" cmd.exe /c ping localhost 
start "MyCommand-%~n0" cmd.exe /c ipconfig /all 
start "MyCommand-%~n0" cmd.exe /c sysinfo 
:loop 
tasklist /fi "windowtitle eq MyCommand-%~n0" | find "===" >nul && goto :loop 
echo finished! 

編輯的評論。 bunch是並行運行的命令數。

@ECHO off 
setlocal enabledelayedexpansion 
set bunch=3 

for /f "delims=:" %%a in ('findstr /n /b "REM ==" %~f0') do set /a datastart=%%a+1 
set count=0 
for /f "skip=%datastart% usebackq delims=" %%a in ("%~f0") do (
    set /a "count=(count+1) %% %bunch%" 
    echo starting: %%a 
    start "MyCommand-%~n0" cmd.exe /c %%a 
    if !count!==0 echo waiting & call :loop 
) 
echo waiting & call :loop 
echo finished! 
goto :eof 

:loop 
tasklist /fi "windowtitle eq MyCommand-%~n0" | find "===" >nul && goto :loop 
goto :eof 

REM == START DATA == 
ping localhost 
ipconfig /all 
systeminfo 
tasklist 
echo hello 
schtasks /query 
wmic bios get /value 
timeout 10 

第一for只是讓您的命令行號(DATA部分的開始)

+0

謝謝斯蒂芬。使用該代碼,我可以問我可以在哪裏放置10000+個命令的其餘部分? (每個命令都不同於另一個,我只是希望能夠並行處理它們的批處理(即2,3或4個)。 – 151SoBad

+0

只是在批處理文件本身的末尾堆疊了命令。當然,您也可以使用外部文件。 – Stephan

相關問題