2013-12-13 8 views
8

मैंने एक एप्लिकेशन लॉन्च करने के लिए बैच फ़ाइल लिखी है (एप्लिकेशन मेरा नहीं है, मैं इसे संशोधित नहीं कर सकता)। बैच फ़ाइल स्वयं कुछ मानकों को स्वीकार करती है। एप्लिकेशन अन्य पैरामीटर स्वीकार करता है। बैच फ़ाइल SHIFT का उपयोग करके अपने सभी विकल्पों का उपभोग करती है, फिर एप्लिकेशन को सही वातावरण के साथ लॉन्च करती है और शेष पैरामीटर को एप्लिकेशन में पास करती है। बैच फ़ाइल बुला का उदाहरण:बैच फ़ाइल पैरामीटर में "=" (बराबर) वर्णों को संरक्षित करना

script.bat -opt-1 -opt-2 /opt-a /opt-b=value 

उदाहरण में, "-opt -1" और "-opt -2" script.bat द्वारा खपत होती है। अंत में, इसे मूल एप्लिकेशन को "/ opt-a" और "/ opt-b = value" पैरामीटर के साथ कॉल करना होगा। एप्लिकेशन द्वारा पिछले पैरामीटर में "=" साइन की उम्मीद है, मैं इसे बदल नहीं सकता। जब मैं सीधे कमांड लाइन से एप्लिकेशन को कॉल करता हूं तो यह अच्छी तरह से काम करता है।

लेकिन जब मैं इसे स्क्रिप्ट से कॉल करता हूं, तो एप्लिकेशन को "/ opt-b = value" के लिए 2 पैरामीटर प्राप्त होते हैं: दोनों "/ opt-b" और "value"। यदि मैं एप्लिकेशन को कॉल करते समय "% *" का उपयोग करता हूं, तो "=" संकेत संरक्षित होते हैं, लेकिन सभी पैरामीटर पास किए जाते हैं (SHIFT का उपयोग करके छोड़े गए पैरामीटर सहित)।

क्या केवल अंतिम पैरामीटर पास करने और "=" संकेतों को संरक्षित करने का कोई तरीका है?

+0

लिया शायद तुम डॉस के भागने चरित्र इस्तेमाल कर सकते हैं: '^' –

+0

मैं इसे करने की कोशिश की, यह काम नहीं करता। न तो '' उद्धरण या ''उद्धरण। –

+0

शायद आप अपनी स्क्रिप्ट पोस्ट कर सकते हैं ताकि लोग इसे कॉपी और पेस्ट कर सकें, देखें कि क्या गलत है, और एक फिक्स का सुझाव दें। – indiv

उत्तर

3

अपने script.bat इस तरह से कॉल करें:

script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 

और script.bat अंदर, आवेदन इस तरह से कहते हैं:

rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
application %1 %~2 

संपादित: टिप्पणियाँ

ठीक करने के लिए प्रतिक्रिया। आइए विस्तार से इस समस्या की समीक्षा करें।

नीचे script.bat फ़ाइल:

@echo off 
rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
ECHO application %1 %~2 

(कृपया ध्यान दें ECHO आदेश) सही ढंग से जब अपने चौथे पैरामीटर उद्धरण में संलग्न है "कहते हैं" एक समान हस्ताक्षर सहित दूसरा पैरामीटर के साथ आवेदन,

C:\> script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 
application /opt-a /opt-b=value 

हालांकि, अगर आवेदन एक बैच फ़ाइल है, तो यह एक ही समस्या से ग्रस्त है: अगले स्क्रीन उत्पादन शो के रूप में मूल script.bat फ़ाइल का। आपने कहा था कि "जब मैं सीधे कमांड लाइन से एप्लिकेशन को कॉल करता हूं तो यह अच्छा काम करता है"। ठीक है, यह सच नहीं है:

C:\> type application.bat 
@echo off 
rem ** application.bat ** 
echo 1: %1 
echo 2: %2 
echo 3: %3 
echo 4: %4 

C:\> application /opt-a /opt-b=value 
1: /opt-a 
2: /opt-b 
3: value 
4: 

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

क्या आपने इस समाधान का परीक्षण वास्तविक एप्लिकेशन के साथ किया था?

+0

आप दुर्भाग्य से, जब मैं निम्नलिखित स्क्रिप्ट के साथ उपरोक्त आदेश की कोशिश धन्यवाद:।!

 rem ** script.bat ** rem Consume -opt-1 shift rem Consume -opt-2 shift rem Call the application call %~dp0\application.bat %1 %~2 
 rem ** application.bat ** echo 1: %1 echo 2: %2 echo 3: %3 echo 4: %4 
जब साथ बुलाया 'script.bat -opt -1 -opt-2/ऑप्ट-ए "/ ऑप्ट-बी = मान" ', आउटपुट है:
 1: /opt-a 2: /opt-b 3: 4: 
012 उम्मीद के बजाय (सभी मैं इसे के रूप में वे कर रहे हैं पैरामीटर भेजने चाहते हैं):
 1: /opt-a 2: /opt-b=value 3: 4: 

+0

क्षमा करें, मैं एक अच्छी तरह से स्वरूपित टिप्पणी जोड़ने के लिए कैसे, तुम्हारा ऊपर की तरह (पाठ ब्लॉक के रूप में ठीक से फ़ाइलें प्रारूपित करके यकीन नहीं है)। मुद्दा यह है कि आपका समाधान, जैसा कि मैंने कोशिश की, '/ opt-b = value' के बजाय'/opt-b' पास करता है। –

+0

@ फ्लोरेंट जॉर्जोज़: मुझे लगता है कि यहां एक भ्रम है; मेरे उत्तर में संपादन पढ़ें ... – Aacini

1
FOR /f "tokens=1*" %%x IN ("%*") DO ECHO application %%y 

जहां 1 छोड़ने के लिए पैरामीटर की संख्या है।


परीक्षण ... मुख्य .bat (q20572424.bat)

@ECHO OFF 
SETLOCAL 
ECHO master[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424a.bat %%x 
GOTO :EOF 

सहायक .bat (q20572424a.bat)

@ECHO OFF 
SETLOCAL 
ECHO slave=[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424b.bat %%x 
GOTO :EOF 

दूसरा सहायक .bat (q20572424b.bat)

@ECHO OFF 
SETLOCAL 
ECHO subslave=[%*] 
GOTO :EOF 

परिणाम:

q20572424 -opt-1 -opt-2 /opt-a /opt-b=value

master[-opt-1 -opt-2 /opt-a /opt-b=value] 
slave=[/opt-a /opt-b=value] 
subslave=[] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
slave=[-opt-2 /opt-a /opt-b=value] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
slave=[-opt-1 -opt-2 /opt-a /opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
subslave=[-opt-1 -opt-2 /opt-a /opt-b=value] 

सही प्रतीत होता है कौन सा चल रहा से। प्रत्येक मामले में, सहायक बैच पैरामीटर verbatim प्राप्त करता है; प्रत्येक कॉल के लिए हटाए गए प्रमुख पैरामीटर की संख्या 2,1,0 है।

W7HP - मेरे लिए काम करता है!

+0

धन्यवाद! यह वास्तव में 'echo' के साथ सही उत्तर प्रदर्शित करता है। लेकिन यदि आप वास्तव में एप्लिकेशन को कॉल करके 'echo' बदलते हैं, उदा। 'कॉल% ~ dp0 \ application.bat' जहां application.bat इसके पैरामीटर प्रदर्शित करता है, परिणाम यह है: '1:/opt-a, 2:/opt-b, 3: value'। तो अंतिम पैरामीटर वास्तव में 2 में विभाजित किया गया है ... अपेक्षित परिणाम इसके बजाय है: '1:/opt-a, 2:/opt-b = value'। –

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