केवल इस Windows बैच फ़ाइल की पहली पंक्ति निष्पादित क्यों होती है लेकिन सभी तीन पंक्तियाँ एक कमांड शेल में निष्पादित होती हैं?


171

मेरे पास एक बैच फ़ाइल है जो तीन मावेन कमांड को निष्पादित करती है, एक के बाद एक। प्रत्येक कमांड को स्क्रिप्ट में सफलतापूर्वक निष्पादित किया जा सकता है - स्वयं द्वारा! लेकिन जब मैं सभी तीन कमांड्स को एक ही फाइल में जोड़ता हूं, तो स्क्रिप्ट से बाहर निकलने से पहले केवल एक ही निष्पादित होता है। कोई विचार क्यों?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

इसके अलावा, अगर मैं सभी तीन आदेशों को कॉपी करता हूं और उन्हें कमांड शेल (cmd.exe) में पेस्ट करता हूं, तो वे एक के बाद एक बिना किसी समस्या के निष्पादित करते हैं। तो यह जाहिरा तौर पर डॉस बैच फ़ाइल के साथ कुछ समस्या है।


2
क्या संयोग है: मैं एक ही समस्या के साथ यहाँ आया था और मेरे बैच फ़ाइल में भी एक ही आदेश - "mvan install: install-file" की कई पंक्तियाँ :-D
फिशबोन


1
@ फिशबोन और संयोग से आप और ओपी दोनों की 1.3k प्रतिष्ठा है ..
p_champ

जवाबों:


297

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

एक और चीज जो आप कोशिश कर सकते हैं वह है startकमांड का उपयोग करना जो समान रूप से काम करना चाहिए।


1
मैंने antविंडोज़ बैच फ़ाइलों के अंदर डाल दिया है और निष्पादित callकरने के लिए आवश्यक था antcallपहले आदेश के बाद बैच के बिना बंद हो जाएगा, इसलिए दूसरे दो निष्पादित नहीं कर रहे हैं। अधिक जानकारी के लिए microsoft.com/resources/documentation/windows/xp/all/proddocs/…call
Owen

22
startस्पॉन के लिए एक नई विंडो का कारण होगा, और प्रत्येक तीन कमांड समानांतर में चलेंगे। यदि आपको उन्हें समकालिक रूप से चलाने की आवश्यकता है, तो उपयोग करें call
akf

11
इस तरह से व्यवहार करने के लिए एक स्क्रिप्टिंग वातावरण के लिए पृथ्वी पर कैसे समझ में आता है? अगर मैंने दो आदेशों के साथ एक स्क्रिप्ट लिखी है, तो मुझे उम्मीद है कि आदेशों को निष्पादित किया जाएगा; मुझे उम्मीद नहीं है कि पर्यावरण केवल मेरी स्क्रिप्ट को निष्पादित करने से रोकने का फैसला करेगा, क्योंकि उन आदेशों में से एक को स्क्रिप्ट के रूप में लागू किया जाना है।
bames53

3
@ bames53: यह एक सीमा है जो DOS से उत्पन्न हुई है जो विंडोज में कमांड प्रॉम्प्ट के आधुनिक कार्यान्वयन में ले जाती है। चूंकि Microsoft के लक्ष्य पिछड़े अनुकूलता को बनाए रखने के लिए थे, यह परिणाम है।
जेफ मर्काडो

2
call pauseयदि आप cmd खिड़कियां खुली रखना चाहते हैं तो अंत में (बिना उद्धरण के) जोड़ें
JinSnow

28

callमदद कर रहा है। हालांकि आज यह नहीं किया।

यह मैंने इसे कैसे हल किया:

चमगादड़ की सामग्री (यदि आप किसी त्रुटि के बैच को रोकना चाहते हैं)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

चमगादड़ की सामग्री (यदि आप किसी त्रुटि के बाद बैच जारी रखना चाहते हैं)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(यहाँ पहला उदाहरण समान रूप से cmd1 && cmd2 && cmd3 && cmd4, सभी आदेशों को एक पंक्ति बनाने के बराबर है ।)
बेन गोटोव

2
सच। मैंने इसे इस तरह से लिखा क्योंकि एक बैट फ़ाइल है, ज्यादातर आपके पास कई, संभवतः लंबे कमांड होंगे, एक पंक्ति में 4 कमांड भविष्य के रखरखाव में अच्छे नहीं होंगे। अच्छे कार्यक्रम लिखने में पठनीयता महत्वपूर्ण है और इसलिए वे विभिन्न लाइनों पर हैं।
मनोहर रेड्डी ने 3

1
इस समाधान ने मेरे लिए चाल चली। callसमाधान त्रुटियों पर रोक नहीं किया गया था, यह एक है।
टिम

9

एक स्क्रिप्ट से अधिक मावेन बिल्ड को निष्पादित करने के लिए आप निम्न तरीके से विंडोज कॉल फ़ंक्शन का उपयोग करेंगे :

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

1

यह होना चाहिए कि विशेष mvnकमांड execएस और वापस नहीं आता है, जिससे बाकी कमांड निष्पादित नहीं होते हैं।


क्या स्क्रिप्ट को अगले mvnकमांड को निष्पादित करने के लिए मजबूर करने का एक तरीका है ?
विकी

1

निम्न बैच फ़ाइल लिखने और उसे निष्पादित करने का प्रयास करें:

Echo one
cmd
Echo two
cmd
Echo three
cmd

केवल पहली दो पंक्तियों को निष्पादित किया जाता है। लेकिन यदि आप कमांड प्रॉम्प्ट पर "बाहर निकलें" टाइप करते हैं, तो अगली दो लाइनें संसाधित होती हैं। यह एक शेल लोडिंग है।

यह सुनिश्चित करने के लिए कि यह वह नहीं है जो आपकी स्क्रिप्ट में हो रहा है, पहला कमांड समाप्त होने पर बस "बाहर निकलें" टाइप करें।

HTH!


संभावना; मावेन वास्तव में एक बैच फ़ाइल का उपयोग करता है जिसके कारण उन्हें उपयोग करने की आवश्यकता होती है call। यह एक नेस्टेड शेल नहीं है जिसे समाप्त नहीं किया गया है।
जॉय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.