2012-09-25 13 views
13

मेरे पास 4 बैच फ़ाइलें हैं। मैं एक साथ, one.bat और two.bat को एक साथ चलाने के लिए चाहता हूं। इन दो बैच फ़ाइलों को पूरा करने के बाद, three.bat और four.bat समानांतर में एक साथ चलना चाहिए। मैंने कई तरीकों से कोशिश की लेकिन मोटो ठीक काम करता है।समांतर बैच स्क्रिप्ट्स की प्रतीक्षा

क्या कोई इस पर मेरी सहायता कर सकता है?

उत्तर

3

एक मास्टर.बैट फ़ाइल बनाएं जो एक .bat और two.bat शुरू करता है। वे

if errorlevel 0 echo ok>c:\temp\OKONE 
if errorlevel 0 echo ok>c:\temp\OKTWO 

समाप्त कर दिया है one.bat और सही ढंग से अंत two.bat, वे फाइल करने के लिए गूंज जब तब master.bat दो फ़ाइलों के अस्तित्व के लिए प्रतीक्षा

del c:\temp\OKONE 
del c:\temp\OKTWO 
start one.bat 
start two.bat 
:waitloop 
if not exist c:\temp\OKONE (
    sleep 5 
    goto waitloop 
    ) 
if not exist c:\temp\OKTWO (
    sleep 5 
    goto waitloop 
    ) 
start three.bat 
start four.bat 

एक और तरीका है की कोशिश करने के लिए है/WAIT ध्वज

start /WAIT one.bat 
start /WAIT two.bat 

लेकिन आपके पास त्रुटियों पर कोई नियंत्रण नहीं है।

यहाँ कुछ संदर्भ

http://malektips.com/xp_dos_0002.html

http://ss64.com/nt/sleep.html

http://ss64.com/nt/start.html

+4

'प्रारंभ/WAIT xxx' बैच फ़ाइल में अगली पंक्ति में निष्पादन पास करने से पहले xxx को समाप्त करने के लिए प्रतीक्षा करता है। तो 'one.bat' को' दो .bat' से पहले भी समाप्त करना होगा। आप मान सकते हैं कि 'one.bat' हमेशा पहले खत्म होगा और' प्रारंभ/प्रतीक्षा दो .bat' का उपयोग करें, लेकिन यह काफी धारणा है। बीटीडब्लू, आपको 'चार.बैट' शुरू करने की ज़रूरत नहीं है, आप 'चार.बैट' को कॉल करने के बाद 'कॉल' को छोड़ सकते हैं, या यहां तक ​​कि 'कॉल' को छोड़ दें, और 'चार.बैट' निष्पादित करने के बाद कुछ और नहीं किया जाना चाहिए) एक और कमांड प्रोसेसर लॉन्च करके इस्तेमाल की जाने वाली मेमोरी को सेव करें। –

+0

प्रारंभ/डब्ल्यूएआईटी के उल्लेख से पहले साझा दृष्टिकोण के लिए उपयोगी के रूप में चिह्नित किया गया। यह भी सुनिश्चित करें कि आप एक .bat और two.bat शुरू करने से पहले उन फ़ाइलों को master.bat से हटा दें। –

+0

सुझाव के लिए धन्यवाद, तदनुसार पोस्ट संपादित करें :-) –

14

यह आसानी से एक समाधान मैं Parallel execution of shell processes के लिए प्रदान की एक बहुत सरलीकृत संस्करण का उपयोग किया जाता है। फ़ाइल लॉकिंग कैसे काम करता है इसके स्पष्टीकरण के लिए उस समाधान का संदर्भ लें।

@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 
+0

यह मेरी आवश्यकताओं के लिए बहुत अच्छा काम किया। धन्यवाद! मुझे यह भी सुनिश्चित करना था कि उन आदेशों को सफलता के साथ भाग लिया जाए। तो यह और अधिक दिखता है: "" 9> "% लॉक% 1" सीएमडी/सी "one.bat> एक-log.txt 2> और 1 && सफलता को गूंजें> एक-success.t.t... फिर, सुनिश्चित करें कि प्रत्येक-असफल।txt फ़ाइल मौजूद है, और प्रत्येक -log.txt से आउटपुट टाइप करें। – macetw

+0

@macetw मैं आपका समाधान देखना चाहता हूं जो कोड ब्लॉक में सफलता के लिए जांच करता है ताकि वह पठनीय हो। क्या आप ऊपर दिए गए उत्तर को संपादित कर सकते हैं या अपना कोड ब्लॉक उत्तर के रूप में सबमिट कर सकते हैं? – SketchBookGames

+1

प्रतीक्षा करने के लिए आप पिंग के बजाय ['1> nul 2> nul timeout 1' का उपयोग कर सकते हैं] (http://stackoverflow.com/q/1672338/995714) –

5

मुझे यह वही दुविधा थी। इस मुद्दे को हल करने का तरीका यहां दिया गया है।

:Loop 
tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
timeout /t 3 
GOTO :Loop 
) 
echo one.bat has stopped 
pause 

है ताकि वह के लिए फ़िल्टरिंग है आप लिपि में

<AAA>, <BBB>, <CCC>

मूल्यों बदलाव करने की आवश्यकता होगी: मैं कि क्या प्रक्रिया अभी भी चल रहा है या नहीं नजर रखने के लिए कार्यसूची आदेश इस्तेमाल किया आपकी प्रक्रिया

उम्मीद है कि मदद करता है।