2016-10-11 9 views
5

, मैं दो बैच फ़ाइलें कॉल: BatchA.bat, BatchB.bat BatchA.batB1.bat, B2.bat, B3.bat बुला रहा है और एक ही समय में तीन बैच फ़ाइलें (तीन बैच फ़ाइलें 'प्रस्तुति क्रम करता है चलाता है कोई बात नहीं)। इस BatchA.bat है:सी # कंसोल बैच एकाधिक बैच फ़ाइलें

start B1.bat 
start B2.bat 
start B3.bat 

BatchB.batB4.bat, B5.bat, B6.bat बुला और एक ही समय में तीन बैच फ़ाइलों चलाता है (तीन बैच फ़ाइलें 'चल क्रम आवश्यक नहीं है)। इस BatchB.bat है:

start B4.bat 
start B5.bat 
start B6.bat 

मैं उपयोग कर रहा हूँ सी # कंसोल आवेदन BatchA.bat, BatchB.bat कॉल करने के लिए है, लेकिन मुझे यकीन है कि BatchB.batBatchA.bat जब तक शुरू नहीं होगी अगर समाप्त करने की जरूरत है। दूसरे शब्दों में, मैं सभी B1.bat, B2.bat और B3.bat पूरा इससे पहले कि मैं शुरू सुनिश्चित करने की आवश्यकता BatchB.bat

यह सी # कोड है:

proc.StartInfo.FileName = BatchA.bat; 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
proc.Start(); 
proc.WaitForExit(); 
int exitCode = proc.ExitCode; 
proc.Close(); 
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString()); 

proc.StartInfo.FileName = BatchB.bat; 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
proc.Start(); 
proc.WaitForExit(); 
exitCode = proc.ExitCode; 
proc.Close(); 
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString()); 

जब मैं इस चलाने के लिए, सभी 6 बैच फ़ाइलें एक ही में शुरू पहर। मैं कैसे सुनिश्चित कर सकता हूं कि BatchA.bat तब तक पूरा नहीं हुआ जब तक कि सभी तीन छोटी बैच फ़ाइलें पूरी नहीं हो जातीं?

+0

कॉल BatchB। – Squashman

उत्तर

1

यह सभी तीन बैच फ़ाइलों को समानांतर में अपनी खिड़की में लॉन्च करेगा और बैच को लॉन्च करने से पहले तीनों को समाप्त करने की प्रतीक्षा करेगा।

@echo off 
start "" /wait cmd /c batch1.bat |start "" /wait cmd /c batch2.bat |start "" /wait cmd /c batch3.bat 
batchb.bat 
+1

यह सुनिश्चित नहीं करेगा कि 'बी 1' या' बी 2' समाप्त हो गया है। –

+1

@MCND, मेरा कोड अपडेट किया गया। हालांकि आपका जितना साफ नहीं है। – Squashman

+0

दरअसल आपने उस कोड को पोस्ट किया है जिसे मैं अपने उत्तर में इंगित व्यवहार को संभालने के लिए शामिल करने जा रहा था। पाइप को कोडिंग इस तरह से 'बी 1' ...' बी 3' से शुरू की गई प्रक्रियाओं की प्रतीक्षा नहीं करेगा। –

3

यह पाइप के start आदेशों हो सकता है ऐसा करने का एक आसान तरीका। बच्चे अंत प्रक्रियाओं के दौरान, पाइप के बाएं हिस्से, बंद कर दिया जाएगा बंद करने पूर्ण पाइप और बैच निष्पादन के लिए जारी रहेगा

तो, batchA.cmd रूप

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    echo starting BatchA 
    (
     start "b1" cmd /c b1.cmd 
     start "b2" cmd /c b2.cmd 
     start "b3" cmd /c b3.cmd 
    ) | more 

    echo BatchA has ended 

टिप्पणी कोडित किया जा सकता है: इस विधि, जबकि सरल, एक कमी हो सकती है (या नहीं, यह जरूरतों पर निर्भर करता है)। b1 द्वारा शुरू की गई प्रक्रियाएं ... b3 पाइप सक्रिय रख सकती है।

@ स्क्वैशमैन ने पहले ही बैच फ़ाइलों से शुरू की गई प्रक्रियाओं की प्रतीक्षा न करने के लिए code पोस्ट कर दिया है।

+0

यह करने का एक चालाक तरीका है। – soja

0

मुझे बैच फ़ाइलों के साथ ऐसा करने का कोई तरीका नहीं दिख रहा है। "स्टार्ट" कमांड एक प्रक्रिया लॉन्च करता है, और आपको नहीं हैंडल देता है जिससे जांच की जाती है कि प्रक्रिया पूरी हो गई है या इसे पूरा होने तक प्रतीक्षा करें।

शक्तियों के आदेशों के माध्यम से ऐसा करना संभव है।

PS > $x = Start-Process notepad -PassThru 
PS > Wait-Process -Id $x.Id 
1

आप WAITFOR का उपयोग कर सकते हैं। बैच एक में, इस का उपयोग करें:

@echo off 
waitfor done 
waitfor done 
waitfor done 
echo done 

फिर B1, B2, बी 3 में, WAITFOR /SI done का उपयोग करते बैच चल रहा किया जाता है।

वैकल्पिक रूप से, आप बी 1, बी 2, और बी 3 में प्रत्येक मॉनिटर के रूप में 0-बाइट मार्कर फ़ाइल बना सकते हैं, बैच ए को समाप्त करने से पहले किसी के अस्तित्व की जांच कर सकते हैं, लेकिन शायद अधिक जटिल है।

+0

मुझे इसे काम करने के लिए इसका इस्तेमाल करना पड़ा। 'WAITFOR/एस% computername%/एसआई किया ' – Squashman

+0

हू, मुझे आश्चर्य है कि अंतर क्या है। उसी कंप्यूटर पर चलते समय मुझे इसकी आवश्यकता नहीं थी। – soja

0

प्रतीक्षा और एसिंक का उपयोग करने का प्रयास कर रहा है। प्रतीक्षा कीवर्ड का उपयोग करके आप बैच पूरा होने तक अन्य काम जारी रख सकते हैं।

उदाहरण के लिए

,

Task<int> getBatchAData = GetBatchDataAsync(); 

    if (batchAData != 0) 
    { 
     GetBatchB(); 
    } 

    var yourData = await getBatchAData; 

Additonal यहाँ जानकारी: BatchA से https://msdn.microsoft.com/en-us/library/mt674882.aspx

संबंधित मुद्दे