2012-09-07 12 views
5

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

क्या ऐसा करने का कोई आसान तरीका है?

// batch file 
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line} 

बैच इस

batch.bat USR PWD -Dargument1=1 -Dargument2=2 

प्रभावी ढंग से की तरह निष्पादित किया जाएगा, मैं

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

उत्तर

3

for आदेश आप देना चाहिए कि आप क्या चाहते:

for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c 
मदद से for के लिए

(for /?):


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k , myfile.txt में प्रत्येक पंक्ति को पार्स होगा लाइनों कि एक साथ शुरू की अनदेखी अर्धविराम, प्रत्येक पंक्ति से दूसरे और तीसरे टोकन को शरीर के लिए पास करता है, जिसमें कॉमा और/या रिक्त स्थान से घिरे टोकन होते हैं। बॉडी स्टेटमेंट संदर्भ% के लिए नोटिस मुझे दूसरा टोकन,% j प्राप्त करने के लिए तीसरा टोकन प्राप्त करने के लिए, और% के बाद सभी शेष टोकन प्राप्त करने के लिए% k। रिक्त स्थान वाले फ़ाइल नामों के लिए, आपको फ़ाइल नामों को डबल कोट्स के साथ उद्धृत करने की आवश्यकता है। इस तरह से डबल कोट्स का उपयोग करने के लिए, आप को उपयोगबैक विकल्प का उपयोग करने की आवश्यकता है, अन्यथा डबल कोट्स को पार्सल के लिए एक शाब्दिक स्ट्रिंग को परिभाषित करने के रूप में व्याख्या किया जाएगा।


तो मेरी समाधान में, %%a स्क्रिप्ट के लिए पारित पहला तर्क के मान, %%b दूसरा तर्क के मान, और %%c शेष तर्क हैं।

जब मैं एक कमांड प्रॉम्प्ट से batch.bat USR PWD -Dargument1=1 -Dargument2=2 चलाने मैं:

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

echo निकालें do के बाद तर्क के साथ अपने आदेश कॉल करने के लिए।

+1

यह तब तक काम करता है जब तक कि पहले 2 तर्कों में से न तो उद्धृत रिक्त स्थान होते हैं। लेकिन अगर किसी तर्क में उद्धृत रिक्त स्थान होते हैं तो यह असफल हो जाएगा - शायद उपयोगकर्ता नाम या पासवर्ड के साथ कोई समस्या नहीं है, निश्चित रूप से सामान्य समाधान के रूप में स्वीकार्य नहीं है। – dbenham

+0

@ डेबेनहम; आप सही हैं, किसी भी तरह के उद्धृत तारों को पारित करें और सभी दांव बंद हैं। –

+0

वास्तविक रूप से उद्धृत तर्क तब तक ठीक होते हैं जब तक उद्धरण संतुलित होते हैं और तर्कों में रिक्त स्थान या विशेष वर्ण जैसे '&' '|' आदि शामिल नहीं होते हैं। अन्य संभावित समस्या - तर्कों को ',' '' '' अंतरिक्ष के बजाय '='। – dbenham

1

यह तुम क्या चाहते हो सकता है निष्पादित करने के लिए निम्नलिखित चाहते हैं

C:>help shift 
Changes the position of replaceable parameters in a batch file. 

SHIFT [/n] 

If Command Extensions are enabled the SHIFT command supports 
the /n switch which tells the command to start shifting at the 
nth argument, where n may be between zero and eight. For example: 

    SHIFT /2 

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected. 
+0

देख लेकिन इसे यहाँ मदद नहीं करेगा, बदलाव के रूप में मानकों '% 1'..'% 9' लेकिन नहीं के लिए के लिए केवल एक प्रभाव पड़ता है '% *'। इसलिए कुछ पैराफिक्स पैरामीटर के बिना सभी पैरामीटर प्राप्त करने का कोई आसान तरीका नहीं है – jeb

2

पैट्रिक कफ का समाधान आमतौर पर काम करता है, लेकिन अगर पहले 2 तर्कों में से किसी एक उद्धृत रिक्त स्थान या विशेष वर्ण होते हैं तो यह असफल हो जाएगा। यदि तर्क रिक्त स्थान के अलावा किसी अन्य चीज़ के साथ सीमित होते हैं तो यह भी असफल हो जाएगा। फॉर/एफ डिलीमीटर को ,; और = शामिल करने के लिए विस्तारित किया जा सकता है, लेकिन फिर तर्क में विफल होने पर यह विफल हो जाएगा यदि तर्क में से कोई भी उद्धृत डिलीमीटर है।

निम्नलिखित सुधार उद्धृत विशेष वर्णों जैसे & और | का समर्थन करता है, लेकिन तर्क delimiters अभी भी एक समस्या है।

@echo off 
setlocal enableDelayedExpansion 
set args=%* 
for /f "tokens=1,2*" %%a in ("!args!") do (
    endlocal 
    echo arg1=%%a arg2=%%b remainder=%%c 
) 

संपादितयहाँ कि एक ही बात

for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a arg2=%%b remainder=%%c 

समाप्ति संपादित

दुर्भाग्य से वास्तव में एक सामान्य समाधान को प्राप्त होता है USEBACKQ का उपयोग कर एक सरल संशोधन एक गोटो पाश की आवश्यकता है जो प्रत्येक पैरामीटर को 3 से पार करता है। नीचे दिए गए समाधान को तब तक काम करना चाहिए जब तक कि सभी उद्धरण संतुलित न हों और सभी विशेष वर्ण उद्धृत किए जाएं।

@echo off 
setlocal 
set "args=" 
:parseArgs 
set args=%args% %3 
shift /3 
if "%~3" neq "" goto :parseArgs 
if (%3) equ ("") goto :parseArgs 
echo arg1=%1 arg2=%2 remainder=%args% 

सभी सीमाओं को समाप्त करने के लिए कठोर उपायों की आवश्यकता होगी - How to receive even the strangest command line parameters?

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