2009-09-19 10 views
148

कहो, कि मेरे पासविंडोज बैच फ़ाइल चल रहा आदेशों एसिंक्रोनस रूप

  • foo.exe
  • bar.exe
  • baz.exe

मैं कैसे एक से उन सभी को चला सकता हूँ बैच फ़ाइल असीमित रूप से, यानी पिछले प्रोग्राम को रोकने के लिए इंतजार किए बिना?

उत्तर

206

चलाने के लिए प्रत्येक कार्यक्रम आपको क्या चाहिए आपको मिलना चाहिए START आदेश का उपयोग करना:

START "title" [/D path] [options] "command" [parameters] 

हर START मंगलाचरण आदेश अपने पैरामीटर में दिए गए चलाता है और जब तक कि एक /WAIT स्विच के साथ मार डाला तुरंत वापस लौट,।

यह कमांड लाइन ऐप्स पर लागू होता है। कमांड लाइन के बिना ऐप्स तुरंत वैसे भी लौटते हैं, इसलिए सुनिश्चित करें कि, यदि आप सभी अतुल्यकालिक रूप से चलाना चाहते हैं, तो START का उपयोग करें।

+0

का उपयोग कर एप्लिकेशन को बाधित नहीं कर सकते हैं, धन्यवाद। मुझे 'help' की सावधानीपूर्वक प्रत्येक प्रविष्टि पढ़नी चाहिए। :) – RichN

+7

मुझे वास्तव में इसमें परेशानी थी दूसरे दिन। मुझे प्रदर्शन परीक्षण के लिए 30 एक्सप्लोरर विंडो लॉन्च करना पड़ा। काम नहीं किया और यह देखने के लिए मेरे लिए पर्याप्त महत्वपूर्ण नहीं था .. उस खिड़की के बजाय चारों ओर ब्राउज़ करना शुरू कर दिया और कई घंटे बाद जब मैंने इसे बंद कर दिया, तो दूसरा एक पॉप हो गया! और मैं नरक की तरह था, इसे बंद कर दिया .. एक और पॉप अप! 4-5 खिड़कियों के बाद और **** मैंने देखा कि बैचफाइल अभी भी चल रहा है! –

+2

निर्बाध स्व-विज्ञापन: मैंने एक बार बैच बनाया जो किसी प्रकार के थ्रेड पूल के रूप में कार्य करने में सक्षम है, केवल प्रक्रियाओं के लिए: http://stackoverflow.com/questions/672719/parallel-execution-of-shell-processes/676667 # 676667 – Joey

21

निम्नलिखित लाइनों के साथ एक बैच फ़ाइल बनाएँ:

start foo.exe 
start bar.exe 
start baz.exe 

start command एक नई विंडो में अपने आदेश चलाता है, इसलिए सभी 3 आदेशों एसिंक्रोनस रूप से भाग जाता है।

26

आप नई विंडो लॉन्च किए बिना पृष्ठभूमि प्रक्रियाओं अंडे देने के लिए शुरू आदेश का उपयोग कर सकते हैं:

start /b foo.exe

नई प्रक्रिया CTRL-C के साथ interruptable नहीं होंगे; आप केवल CTRL-BREAK (या विंडो बंद करके, या कार्य प्रबंधक के माध्यम से) को मार सकते हैं।

+0

'CTRL-BREAK'' के लिए उपरोक्त। –

+1

इन दिनों कीबोर्ड पर 'BREAK' कहां है? – user2023370

+0

@ user2023370 अभी भी [रोकें] (https://en.wikipedia.org/wiki/File:ANSI_Keyboard_Layout_Diagram_with_Form_Factor.svg) कुंजी पर। अधिकांश लैपटॉप जिनमें कुछ कुंजी की कमी होती है [छिपी हुई कुंजी संयोजन] (https://support.lenovo.com/at/en/documents/ht074004)। –

56

पिछले कुछ उत्तरों को जोड़कर, आप start /b cmd /c foo.exe को आजमा सकते हैं।

एक छोटी सी उदाहरण के लिए, यदि आप बाहर जावा/ग्रूवी/grails/Gradle के संस्करण मुद्रित करने के लिए करना चाहता था, तो आप एक बैच फ़ाइल में ऐसा कर सकता है:

@start /b cmd /c java -version 
@start /b cmd /c gradle -version 
@start /b cmd /c groovy -version 
@start /b cmd /c grails -version 

आप प्रोसेस एक्सप्लोरर की तरह कुछ है, तो (Sysinternals), आप एक जावा प्रक्रिया (उपरोक्त आदेशों के अनुसार) के साथ प्रत्येक बच्चे cmd.exe प्रक्रियाओं को देखेंगे। आउटपुट स्क्रीन पर प्रिंट करेगा जो भी वे पूरा करते हैं।

start /b : Start application without creating a new window. The 
      application has ^C handling ignored. Unless the application 
      enables ^C processing, ^Break is the only way to interrupt 
      the application 

cmd /c : Carries out the command specified by string and then terminates 
+0

क्यों शुरू होने से पहले @ चिह्न आदेश? – Leonel

+7

यह कमांड को कंसोल पर प्रतिबिंबित करने से रोकता है। बैच स्क्रिप्ट में, कभी-कभी आप शुरुआत में 'echo off' देखेंगे, जब आप स्क्रिप्ट निष्पादित करते हैं, तो सभी आदेशों को कंसोल पर प्रतिबिंबित करने से रोक दिया जाएगा। '@' समान है लेकिन केवल उस एकल कमांड के लिए। तो, कभी-कभी आप '@echo off' देखेंगे। – djKianoosh

9

एक तिहाई (और संभावित रूप से बहुत आसान) विकल्प है। यदि आप एक प्रोग्राम के कई उदाहरणों को स्पिन करना चाहते हैं, तो यूनिक्स-शैली कमांड प्रोसेसर जैसे Xargs या GNU समानांतर का उपयोग करके यह काफी सरल प्रक्रिया बना सकता है।

PPX2 नामक एक Win32 Xargs क्लोन है जो इसे काफी सरल बनाता है।

उदाहरण के लिए, यदि आप वीडियो फ़ाइलों की एक निर्देशिका ट्रांसकोड करना चाहता था, आप आदेश चला सकता है:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4" 

इस के अलावा चुनने, dir /b *.mpg की एक सूची पकड़ लेता है।मेरी वर्तमान निर्देशिका में mpg फ़ाइलें, | ऑपरेटर इस सूची को ppx2 में पाइप करता है, जो उसके बाद समानांतर में निष्पादित करने के लिए कमांड की एक श्रृंखला बनाता है; 4 एक समय में, जैसा कि -P 4 ऑपरेटर द्वारा निर्दिष्ट किया गया है। -L 1 ऑपरेटर पीपीएक्स 2 को केवल एक समय में ffmpeg में हमारी निर्देशिका सूची की एक पंक्ति भेजने के लिए कहता है।

उसके बाद, आप सिर्फ अपने आदेश पंक्ति (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") लिखते हैं, और {} स्वचालित रूप से आपके निर्देशिका सूची की प्रत्येक पंक्ति के लिए प्रतिस्थापित किया जाता है।

यह सार्वभौमिक हर मामले के लिए लागू नहीं है, लेकिन बैच फ़ाइल समाधान ऊपर विस्तृत का उपयोग करने से एक पूरी बहुत आसान है। बेशक, यदि आप फ़ाइलों की सूची से निपट नहीं रहे हैं, तो आप किसी टेक्स्टफाइल या किसी अन्य प्रोग्राम की सामग्री को pxx2 के इनपुट में पाइप भी कर सकते हैं।

+1

नवीनतम xargs win32 पोर्ट आजकल अच्छी तरह से काम करता है (वैसे भी विंडोज़ के लिए गिट के साथ शामिल है)। –

+0

यह बहुत अच्छा है सिवाय इसके कि यह यूनिकोड वर्ण वाली फ़ाइलों से निपटने में विफल रहता है। यूनिकोड फ़ाइलों का समर्थन करने के लिए कोई योजना है? धन्यवाद।\ कार्यक्रम ~ 1 \ खिड़की ~ 3 \ MYPROG ~ 1.EXE: –

+0

@ GökhanSever अतीत में मैं "छोटे नाम" पथ के रूप में, कि सी की तरह दिखता है का उपयोग करके इस समस्या के काम किया है। सुंदर नहीं है, लेकिन यह काम करता है। – jmnben

12

उपयोग START command:

start [programPath] 

कार्यक्रम के लिए पथ है तो रिक्त स्थान उद्धरण जोड़ने के लिए याद है। इस मामले में आप भी अंत में उन्हें संलग्न (आदेश उद्धरण के बाहर)

start "[title]" "[program path]" [list of command args] 

उपयोग/b आप तर्क प्रदान करने के लिए की जरूरत है खोलने कंसोल विंडो

start "[title]" "[program path]" 

के लिए एक शीर्षक प्रदान करने की आवश्यकता एक नई कंसोल विंडो खोलने से बचने के लिए विकल्प (लेकिन उस स्थिति में आप CTRL-C

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