एक .BAT फ़ाइल के भीतर कई .BAT फ़ाइलों को चलाने के लिए कैसे करें


695

मैं commit-build.batअपने निर्माण प्रक्रिया के हिस्से के रूप में अन्य .BAT फ़ाइलों को निष्पादित करने के लिए मुझे प्राप्त करने की कोशिश कर रहा हूं ।

की सामग्री commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

यह काफी सरल लगता है, लेकिन commit-build.batकेवल सूची में पहले आइटम को निष्पादित करता है ( msbuild.bat)।

मैंने बिना किसी समस्या के प्रत्येक फाइल अलग से चलायी है।


4
@ सीन - आपको काम करने के लिए कमांड लाइन के बर्तन प्राप्त करने के लिए पूर्ण Cygwin पैकेज स्थापित करने की आवश्यकता नहीं है। बस पैकेज से बाहर सभी cygwin dll ले एक पथ निर्देशिका में उन्हें जगह है, एक और पथ निर्देशिका में अपने सभी उपकरण डाल दिया और आप जाने के लिए अच्छा कर रहे हैं।
टेकी जो

यह मानते हुए कि इन फ़ाइलों में से प्रत्येक केवल बैच हैं इसलिए न केवल उन्हें एक बड़ी फ़ाइल में डालें और प्रत्येक बार शुरू करने की अनुमति देने के लिए टाइमआउट फ़ंक्शन का उपयोग करें।
CMS_95

जवाबों:


1201

उपयोग:

call msbuild.bat
call unit-tests.bat
call deploy.bat

जब कॉल का उपयोग नहीं किया जाता है, तो वर्तमान बैच फ़ाइल बंद हो जाती है और बुलाया बैच फ़ाइल निष्पादित करना शुरू कर देती है। यह एक अजीबोगरीब व्यवहार है जो शुरुआती MS-DOS दिनों में वापस आ जाता है।


अजीब है, मैंने विंडोज 7 पर "कॉल" के बिना कोशिश की है और मुझे याद है कि यह काम करता था, लेकिन विंडोज़ पर इसे इस कमांड की आवश्यकता थी। यह हो सकता है?
Android डेवलपर

7
कॉल के बिना, मूल डॉस कल्पना के अनुसार, कमांड चेनिंग करना चाहिए और वापस नहीं आना चाहिए। "CALL" को जोड़ने से पहले एक लोकप्रिय विकल्प "कमांड / सी सेकंड.बैट" जैसे एक बच्चे के कमांड प्रॉम्प्ट को खोलना था, क्योंकि वह भी वापस आ जाएगा।
ब्रायन नोब्लुच

1
मुझे विंडोज 7 पर आश्चर्य की समस्या थी इसलिए यह केवल
Rafiki

6
विंडोज 10 पर केवल पहली पंक्ति निष्पादित होती है। फिर भी फेनन के जवाब ने काम किया।
रॉब्रो

2
बैच फ़ाइलों के लिए मापदंडों को कैसे पारित किया जाए, और एक परम स्थान के साथ एक मार्ग है।
ज़्यूस

180

अन्य सभी उत्तर सही हैं: कॉल का उपयोग करें। उदाहरण के लिए:

 call "msbuild.bat"

इतिहास

प्राचीन डॉस संस्करणों में बैच फ़ाइलों को पुनरावर्ती रूप से निष्पादित करना संभव नहीं था। फिर कॉल कमांड पेश की गई जिसे बैच फ़ाइल को निष्पादित करने के लिए एक और cmd शेल कहा जाता है और समाप्त होने पर कॉलिंग cmd शेल पर वापस निष्पादन दिया जाता है।

जाहिर है कि बाद के संस्करणों में अब कोई अन्य cmd शेल आवश्यक नहीं था।

शुरुआती दिनों में कई बैच फाइलें इस बात पर निर्भर करती थीं कि बैच फ़ाइल कॉल करने से कॉलिंग बैच फ़ाइल वापस नहीं आएगी। अतिरिक्त सिंटैक्स के बिना उस व्यवहार को बदलने से बैच मेनू सिस्टम (मेनू संरचनाओं के लिए बैच फ़ाइलों का उपयोग करना) जैसी कई प्रणालियां टूट गई होंगी।

माइक्रोसॉफ्ट के साथ कई मामलों में, पिछड़े संगतता इसलिए इस व्यवहार का कारण है।

टिप्स

यदि आपकी बैच फ़ाइलों में उनके नाम के स्थान हैं, तो नाम के चारों ओर उद्धरण का उपयोग करें:

call "unit tests.bat"

वैसे: यदि आपके पास बैच फ़ाइलों के सभी नाम नहीं हैं, तो आप ऐसा करने के लिए भी उपयोग कर सकते हैं (यह बैच फ़ाइल कॉल के सही क्रम की गारंटी नहीं देता है; यह फ़ाइल सिस्टम के आदेश का पालन करता है);

FOR %x IN (*.bat) DO call "%x"

आप कॉल के बाद त्रुटिपूर्ण पर भी प्रतिक्रिया कर सकते हैं। उपयोग:

exit /B 1   # Or any other integer value in 0..255

एक त्रुटि वापस देने के लिए। 0 सही निष्पादन को दर्शाता है। कॉलिंग बैच फ़ाइल में आप का उपयोग करके प्रतिक्रिया कर सकते हैं

if errorlevel neq 0 <batch command>

if errorlevel 1यदि आपके पास सभी त्रुटियां 1 और अधिक को पकड़ने के लिए NT4 / 2000 / XP की तुलना में पुराना विंडोज है, तो उपयोग करें ।

बैच फ़ाइल के प्रवाह को नियंत्रित करने के लिए, गोटो है :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

जैसा कि अन्य ने बताया: बैच फ़ाइलों को बदलने के लिए बिल्ड सिस्टम पर एक नज़र है।


सहमत हुए, लेकिन लूप इस मामले में, फाइलों को गलत (वर्णानुक्रम में) संसाधित कर सकता है
डेव आर्चर

अच्छा और बहुत पूरा जवाब। यदि आप नियंत्रण प्रवाह को शामिल कर रहे हैं, तो यह ध्यान रखना अच्छा होगा कि गोटो के बजाय, आप कॉल: लेबल 1 का उपयोग करके सबरूटीन कर सकते हैं, और बैच फ़ाइलों में 'वापसी' बयान थोड़ा अजीब गोटो है: ईओएफ (और कोई ज़रूरत नहीं है अपने आप से एक ईओफ़ लेबल बनाएं, जो डिफ़ॉल्ट रूप से मौजूद है)।
लेगोलस

errorlevelआदेश उदाहरण मुझे (cmd कंसोल में) Windows 10 पर एक समस्या दे दी है। मैंने केवल होने के लिए कमांड को संशोधित किया if errorlevel neq echo Houston We have a Problem!। मेरी बैच प्रक्रिया में कोई समस्या नहीं थी और ज्यादातर सामान्य रूप से पूरी हुई, लेकिन जिस तरह से मैंने एक कॉल स्टेटमेंट के बाद इस कमांड का उपयोग किया, उसके हर चरण में मुझे "इस समय नीक अप्रत्याशित था"। यह सोचते हुए कि शायद उन्होंने न के बराबर सिंटैक्स को बदल दिया है, मैंने कोशिश की !=और <>साथ ही नए सिंटैक्स के लिए "इस समय अपेक्षित नहीं" त्रुटि भी मिलती रही। मुझ से ऐसी कौनसी गलती हो जाएगी?
TMWP

117

यदि हम कई कमांड प्रॉम्प्ट खोलना चाहते हैं तो हम उपयोग कर सकते हैं

start cmd /k

/k: अनिवार्य है जो निष्पादित करेगा।

कई कमांड प्रॉम्प्ट लॉन्च करने के लिए नीचे के रूप में किया जा सकता है।

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.

7
वह यह है कि क्या हम संकेत के लिए हमारी पहली एप्लिकेशन ब्लॉक के रूप के लिए खोज कर रहे थे, कंसोल, धन्यवाद
माइकल Moeller

1
यह कमांड के कई उदाहरण चलाएगा और यहां तक ​​कि कई बैच फ़ाइलों को चलाने के लिए काम करेगा जिनके पास <pose> है। +1 के रूप में यह बिल्कुल वही उपाय है जिसकी मुझे तलाश थी!
क्रिश्चियन नोएल

5
क्या आप बता सकते हैं कि आपके उत्तर में वे संख्याएँ हैं? उनका उद्देश्य स्पष्ट नहीं है।
कलमला किड

3
ध्यान दें कि ज्यादातर लोग start "Window title" /wait cmd /k call something.batक्रमबद्ध चीजों को चलाने के लिए संभवतः उपयोग करना चाहते हैं ।
एंड्रयू

3
(या start "Window title" /wait cmd /c something.bat, जहाँ cmd /cएक बार खिड़की बंद हो जाती है)
एंड्रयू


28

आप एक कार्यक्रम को संकलित करने के प्रयास में कई बैचों को बुला रहे हैं। मैं इस बात को स्वीकार करता हूं कि यदि कोई त्रुटि होती है:
1) बैच के भीतर कार्यक्रम एक त्रुटि के साथ बाहर निकल जाएगा;
2) आप इसके बारे में जानना चाहते हैं।

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' एक त्रुटि के लिए परीक्षण 0. से अधिक है। इस तरह से सभी बैचों को क्रम में बुलाया जाता है, लेकिन किसी भी त्रुटि को रोक देगा, स्क्रीन को छोड़ देगा क्योंकि यह आपके लिए कोई त्रुटि संदेश देखना है।


23

अगर हमारे पास दो बैच स्क्रिप्ट, आआ.आब और bbb.bat हैं, और नीचे की तरह कॉल करें

call aaa.bat
call bbb.bat

स्क्रिप्ट निष्पादित करते समय, यह आआ.आबट को कॉल करेगा, आआ.बेट समाप्त होने के धागे की प्रतीक्षा करें, और bbb.bat पर कॉल करें।

लेकिन अगर आप bbb.bat को कॉल करने के लिए aaa.bat का इंतजार नहीं करना चाहते हैं, तो START कमांड का उपयोग करने का प्रयास करें :

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

परीक्षा:

start /b aaa.bat
start /b bbb.bat


20

किसी .batफ़ाइल के भीतर फ़ाइल कॉल करने के लिए .bat, उपयोग करें

call foo.bat

(हां, यह मूर्खतापूर्ण है, यह अधिक समझ में आता है अगर आप इसे कॉल कर सकते हैं foo.bat, जैसे आप कमांड प्रॉम्प्ट से कर सकते हैं, लेकिन इसका सही तरीका उपयोग करना है call।)


7

अपने फ़ाइल नाम को देखते हुए, क्या आपने NAnt या Ant (Java संस्करण) जैसे बिल्ड टूल का उपयोग करने पर विचार किया है । आप बल्ले फ़ाइलों के साथ की तुलना में बहुत अधिक नियंत्रण प्राप्त करेंगे।


7

यदि आप एक साथ कई बैच फाइल खोलना चाहते हैं तो आप कॉल कमांड का उपयोग कर सकते हैं। हालाँकि, कॉल कमांड वर्तमान बैट फाइल को बंद कर देती है और दूसरे में चली जाती है। यदि आप एक साथ कई खोलना चाहते हैं, तो आप यह कोशिश करना चाहते हैं:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

और फिर भी कई फ़ाइलों के लिए cmd" call..." शुरू या दोहराएं । यह विंडोज 7 के लिए काम करता है , लेकिन मैं अन्य प्रणालियों के बारे में निश्चित नहीं हूं।


6
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

यदि यह काम नहीं करता है, तो इसे बदलें या इसके startसाथ callप्रयास करें:

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat

3

बस callकमांड का उपयोग करें ! यहाँ एक उदाहरण है:

call msbuild.bat
call unit-tests.bat
call deploy.bat

3

सही उद्धरण के साथ (यह कभी-कभी मुश्किल हो सकता है):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

1 आर्ग - शीर्षक (इस मामले में खाली)
2 आर्ग - / डी निर्दिष्ट निर्देशिका शुरू करने, यदि वर्तमान कार्यशील निर्देशिका (जैसे कि "% ~ dp0") चाहते ommited किया जा सकता है
3 आर्ग - कमांड लांच करने के लिए, "cmd.exe"
4 arg - इसके अंदर तर्कों के लिए उद्धरणों को दोगुना करने के साथ कमांड करने के लिए तर्क (यह है कि आप बैच में उद्धरणों के भीतर उद्धरणों से कैसे बच सकते हैं)


2

एक से अधिक स्क्रिप्ट चलाने से मेरा एक ही मुद्दा था। मैं इसे पहले एक पर नहीं मर रहा था एहसास है कि यह पहली स्क्रिप्ट पर बाहर निकल रहा था।

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

मैंने अपनी सभी 11 स्क्रिप्ट्स EXIT लाइनों को हटा दिया और फिर से कोशिश की और सभी 11 एक ही कमांड विंडो में एक समय में एक क्रम में चले गए।

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

एस को न हटाएं exit, goto :eofइसके बजाय उन्हें बदलें । यह call
Stephan

आपको पता चलता है कि एक साधारण बैच कमांड में वे क्रम में चलेंगे जिन्हें इंडेक्स @echo off :menu some commands goto menuनोट के लिए मूल लेआउट भी कहा जाता है। यह बंद होने के बाद एक निरंतर लूप चलाएगा। मूल रूप से आपको ::बस जरूरत नहीं है:
CMS_95

0

निम्नलिखित ने मेरी समस्या हल कर दी:

start call "batch1.bat"
start call "batch2.bat"

0

क्या आप यह चाहते हैं:

समानांतर में बैच स्क्रिप्ट चलाएँ-

start "systemLogCollector" /min cmd /k call systemLogCollector.bat
start "uiLogCollector" /min cmd /k call uiLogCollector.bat
start "appLogCollector" /min cmd /k call appLogCollector.bat

यहां तीन बैच की फाइलें अलग-अलग कमांड विंडो पर न्यूनतम स्थिति में चलाई जाती हैं। यदि आप उन्हें कम से कम नहीं करना चाहते हैं, तो हटा दें/min । इसके अलावा, अगर आपको बाद में उन्हें नियंत्रित करने की आवश्यकता नहीं है, तो आप शीर्षकों से छुटकारा पा सकते हैं। तो, एक नंगे हड्डी आदेश होगा-start cmd /k call systemLogCollector.bat


यदि आप उन्हें समाप्त करना चाहते हैं-

taskkill /FI "WindowTitle eq appLogCollector*" /T /F
taskkill /FI "WindowTitle eq uiLogCollector*" /T /F
taskkill /FI "WindowTitle eq systemLogCollector*" /T /F
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.