2011-02-10 16 views
72

मेरा ओएस विंडोज विस्टा है। मुझे ".bat" फ़ाइल की आवश्यकता है जहां मुझे यह जांचने की आवश्यकता है कि उपयोगकर्ता कोई कमांड लाइन पैरामीटर दर्ज करता है या नहीं। अन्यथा मैं लूंगा झंडा "अमान्य इनपुट" अगर करता है तो अगर पैरामीटर -b के बराबर है तो मैं कुछ करना होगा। यदि उपयोगकर्ता कोई कमांड लाइन पैरामीटर दर्ज नहीं करता है तो मैं कुछ करूँगा। मैंने निम्नलिखित .bat फ़ाइल बनाई है। यह -b और -b मामलों के लिए नहीं-बराबर के लिए काम करता है - लेकिन यह विफल रहता है जब उपयोगकर्ता किसी भी कमांड लाइन पैरामीटर पारित नहीं करता है।".bat" फ़ाइल में कमांड लाइन पैरामीटर कैसे जांचें?

मैं हमेशा मिलता त्रुटि:

GOTO was unexpected at this time. 

किसी को भी मुझे बता सकते हैं मैं गलत यहाँ क्या कर रहा हूँ? if "%~1"=="" goto blank

आपके द्वारा किए गए एक बार है कि, तो बी पर एक अगर/किसी और स्विच करना: if "%~1"=="-b" (goto specific) else goto unknown

आसपास


ECHO OFF 
CLS 
ECHO. 

IF [%1]==[/?] GOTO BLANK 

IF %1=="-b" GOTO SPECIFIC 

IF NOT %1=="-b" GOTO UNKNOWN 

:SPECIFIC 

ECHO SPECIFIC 

GOTO DONE 

:BLANK 

ECHO No Parameter 

GOTO DONE 

:UNKNOWN 

ECHO Unknown Option 

GOTO DONE 

:DONE 

ECHO Done! 
+0

आप अन्य दो 'IF' बयान करने के लिए (' गोटो BLANK' लाइन में की तरह) कोष्ठक जोड़ते हैं तो वह इस समस्या को ठीक करता है? –

उत्तर

89

आप पैरामीटर खाली होने के लिए जांच करने की आवश्यकता उद्धरण वाले पैरामीटर रिक्त/खाली/गायब मानकों जैसी चीजों की जांच को आसान बनाते हैं। "~" सुनिश्चित करता है कि डबल कोट्स स्ट्रिप किए गए हैं यदि वे कमांड लाइन तर्क पर थे।

+0

यह काम करता है !! केवल "अन्य" स्वीकार नहीं किया जाता है। मुझे त्रुटि मिलती है: 'else' को आंतरिक या बाहरी कमांड, ऑपरेट करने योग्य प्रोग्राम या बैच फ़ाइल के रूप में पहचाना नहीं जाता है। इसलिए मैंने "बराबर-बीबी" मामले के लिए एक और IF जोड़ा। त्वरित उत्तर के लिए धन्यवाद। – javauser71

+5

ईएलएसई को आईएफ के समान लाइन पर होना चाहिए, या इसे सीधे ब्रैकेट – jeb

+4

के बाद होना चाहिए यदि% 1 में रिक्त स्थान हैं, तो यह मेरे लिए काम नहीं करता है, जो मामला हो सकता है यदि यह पूरा पथ है एक निष्पादन योग्य [यिर्मयाह विलकॉक का उत्तर] देखें (http://stackoverflow.com/a/4953226/1840078) ऐसे समाधान के लिए जो उनके मूल्यों में रिक्त स्थान वाले पैरामीटर के लिए भी काम करता है। –

23
एक जवाब के लिए http://ss64.com/nt/if.html पर

देखो; आदेश IF [%1]==[] GOTO NO_ARGUMENT या इसी तरह है।

+0

हां देखें - यह भी काम करता है। त्वरित उत्तर के लिए धन्यवाद। – javauser71

+1

न केवल यह भी काम करता है! यह सिर्फ '% 1 "==" "' के विपरीत, काम करता है। मुझे अपने उत्तर में उस पर विस्तृत जानकारी देना है। –

+1

यह तब टूट जाएगा जब% 1 उद्धृत किया गया है, उदा। 'foo.bat" पहला पैरामीटर "2nd_param'। Https: // stackoverflow देखें।कॉम/प्रश्न/2541767/क्या-उचित-तरीके-से-परीक्षण-if-variable-is-blank-in-a-batch-file –

4

आप तुलना कर रहे हैं तार। एक तर्क छोड़े गए हैं, %1 एक खाली करने के लिए फैलता है तो आदेशों उदाहरण के लिए IF =="-b" GOTO SPECIFIC (जो एक सिंटैक्स त्रुटि है) हो जाते हैं। उद्धरण (या वर्ग ब्रैकेट) में अपने तार लपेटें।

REM this is ok 
IF [%1]==[/?] GOTO BLANK 

REM I'd recommend using quotes exclusively 
IF "%1"=="-b" GOTO SPECIFIC 

IF NOT "%1"=="-b" GOTO UNKNOWN 
+0

देखें [% 1] == [/?] काम नहीं कर रहा है, लेकिन अगर मैं [% 1] == [] या "% 1" == "" करता हूं, तो यह काम करता है। वैसे भी मैं जा रहा हूँ। अपनी त्वरित प्रतिक्रिया के लिए धन्यवाद। – javauser71

6

अन्य उत्तर है, जो मैं सदस्यता के लिए इसके अलावा, आप IF कमान की /I स्विच का उपयोग करने पर विचार कर सकते हैं।

... the /I switch, if specified, says to do case insensitive string compares.

यदि आप पैरामीटर निर्दिष्ट करने के लिए अपने उपयोगकर्ताओं को केस असंवेदनशील लचीलापन देना चाहते हैं तो यह मदद की जा सकती है।

if [%1]==[] goto :blank 

या (जब आप उद्धृत आर्ग को संभालने के लिए की जरूरत है, के नीचे स्थित संपादित देखें):: -

IF /I "%1"=="-b" GOTO SPECIFIC 
7

संक्षिप्त उत्तर वर्गाकार कोष्ठकों का उपयोग

if [%~1]==[] goto :blank 

क्यों? आप पूछ सकते हैं खैर, जैसे यिर्मयाह विलकॉक ने उल्लेख किया: http://ss64.com/nt/if.html - वे इसका उपयोग करते हैं! ठीक है, लेकिन उद्धरण के साथ क्या गलत है?

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

इस छोटे से स्क्रिप्ट पर विचार करें:

@rem argq.bat 
@echo off 

:loop 
if "%1"=="" goto :done 
echo %1 
shift 
goto :loop 

:done 
echo Done. 

के परीक्षण करते हैं:

C:\> argq bla bla 
bla 
bla 
Done. 

काम करने के लिए लगता है। लेकिन अब, की सुविधा देता है दूसरे गियर के लिए स्विच:

C:\> argq "bla bla" 
bla""=="" was unexpected at this time. 

बूम यह सच तक आकलन नहीं किया है, न तो यह गलत पर मूल्यांकन किया। लिपि डायड। यदि आप रेखा के नीचे कहीं भी रिएक्टर को बंद करना चाहते थे, तो अच्छी तरह से कठिन भाग्य। अब आप हैरी डाघ्लियन की तरह मर जाएंगे।

आप सोच सकते हैं - ठीक है, तर्कों में उद्धरण शामिल नहीं हो सकते हैं। अगर वे करते हैं, तो ऐसा होता है। ओह, हाँ

C:\> argq ""bla bla"" 
""bla 
bla"" 
Done. 

: गलत यहाँ कुछ सांत्वना है। चिंता न करें - कभी-कभी यह काम करेगा। कि यह ऊपर के मामलों के लिए ठीक काम करता है

@rem args.bat 
@echo off 

:loop 
if [%1]==[] goto :done 
echo %1 
shift 
goto :loop 

:done 
echo Done. 

आप अपने आप को परीक्षण कर सकते हैं,:

चलो एक और स्क्रिप्ट कोशिश करते हैं। यह तार्किक है - उद्धरणों के पास ब्रैकेट के साथ कुछ लेना देना नहीं है, इसलिए यहां कोई जादू नहीं है। लेकिन ब्रैकेट के साथ तर्क को मसाला देने के बारे में क्या?

D:\>args ]bla bla[ 
]bla 
bla[ 
Done. 

D:\>args [bla bla] 
[bla 
bla] 
Done. 

कोई भाग्य नहीं है। ब्रैकेट बस cmd.exe के पार्सर को दबा नहीं सकते हैं।

चलो एक पल के लिए बुरे उद्धरण पर वापस जाएं। समस्या, वहाँ था जब तर्क एक उद्धरण के साथ समाप्त हो गया:

D:\>argq "bla1 bla2" 
bla2""=="" was unexpected at this time. 

क्या होगा अगर मैं सिर्फ पारित:

D:\>argq bla2" 
The syntax of the command is incorrect. 

स्क्रिप्ट बिल्कुल नहीं चलेंगे। args.bat के लिए एक ही:

D:\>args bla2" 
The syntax of the command is incorrect. 

लेकिन क्या मैं, मिलता है जब " -characters की संख्या "मैच" (यानी - है भी), इस तरह के एक मामले में:

D:\>args bla2" "bla3 
bla2" "bla3 
Done. 

अच्छा - मुझे उम्मीद है कि आपने .bat फ़ाइलों को उनके कमांड लाइन तर्कों को विभाजित करने के बारे में कुछ सीखा है (HINT: * यह बिल्कुल बैश में नहीं है)। उपर्युक्त तर्क में एक स्थान है। लेकिन उद्धरण स्वचालित रूप से छीन नहीं जाते हैं।

और argq? यह उस पर प्रतिक्रिया कैसे करता है? जाहिर:

D:\>argq bla2" "bla3 
"bla3"=="" was unexpected at this time. 

तो - लगता है कि इससे पहले कि आप कहते हैं कि: "। जानें कि क्या बस उद्धरण चिह्नों का उपयोग [वजह से, मेरे लिए, यह अच्छा लग रहा है]"।

संपादित

हाल ही में, इस उत्तर के बारे में टिप्पणी कर रहे थे - ठीक है, sqare कोष्ठक "संभाल नहीं कर सकते" उद्धृत तर्क गुजर और उन्हें इलाज के बस के रूप में यदि वे उद्धृत नहीं किया गया।

वाक्य रचना:

if "%~1"=="" (...) 

दोहरे उद्धरण चिह्नों के कुछ नव पाया पुण्य है, लेकिन तर्क चर से बोलियां अलग करना, के एक स्वच्छ सुविधा का प्रदर्शन करता है, तो पहली और आखिरी चरित्र एक दोहरे उद्धरण है नहीं है ।

इस "तकनीक" वर्ग कोष्ठक के साथ बस के रूप में अच्छी तरह से काम करता है:

if [%~1]==[] (...) 

यह इस का कहना है के लिए एक उपयोगी बात थी, तो मैं भी नया उत्तर वोट दें।

आखिरकार, डबल कोट प्रशंसकों, "" फ़ॉर्म की एक तर्क आपकी पुस्तक में मौजूद है, या यह खाली है? बस पूछें ';

+1

स्क्वायर ब्रैकेट '[% 1] == [- b] 'अगर arg.bat' -b" 'की तरह उद्धृत किया गया है तो मिलान नहीं होगा। Https://stackoverflow.com/a/46942471 – wisbucky

+0

ऐतिहासिक रूप से नोट करें: '[% 1] == [- b]' और '"% 1 "==" - b "' 98 और पहले एमएस जीतने के लिए समान थे/पीसी-डॉस सिस्टम बैच स्क्रिप्ट्स। चूंकि जीत 2000/एनटी ने वाक्यविन्यास 'अगर ~% ~ 1 "==" - बी "' कहा है, जहां डबल कोट्स का विशेष अर्थ है, जिस तरह से आपको स्क्रिप्ट को कोड करना चाहिए क्योंकि यह अधिक मजबूत सुरक्षा प्रदान करता है। डबल उद्धरण विशेष वर्णों के अर्थ से बचें (कोशिश करें और | और कमांड लाइन में% वर्ण)। 99.9% उदाहरण डबल कोट्स सिंटैक्स के साथ काम करते हैं - आपका उदाहरण 'argq bla2 "" bla3' स्क्वायर ब्रैकेट को औचित्य देने का एकमात्र मामला है। एम्बेडेड डबल कोट्स आपदा के लिए एक नुस्खा है - बस ' –

+0

@SkipR कहें - यही कारण है कि विंडोज़' फाइल सिस्टम में, आप इन विशेष पात्रों को नामों में नहीं रख सकते हैं। मेरे पास गणितीय सबूत नहीं है, लेकिन मुझे लगता है कि 'cmd' खोल में बस सबकुछ उद्धृत नहीं किया जा सकता है (कुछ एस्केप अनुक्रम इत्यादि के माध्यम से किए गए वर्बैटिम के अर्थ में)। अन्य प्रणालियों में आप कभी-कभी सबकुछ उद्धृत कर सकते हैं, एनयूएल चरित्र शामिल है। (https://stackoverflow.com/questions/2730732/how-can-i-write-a-null-ascii-character-nul-to-a-file-with-a-windows-batch-scri#2769141) - यह सवाल सिर्फ दिखाता है, आपको कुछ बाहरी कार्यक्रमों का उपयोग करने की आवश्यकता है। –

2

असल में, अन्य सभी उत्तरों में त्रुटियां हैं। सबसे विश्वसनीय तरीका है:

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

विस्तृत स्पष्टीकरण:

का उपयोग "%1"=="-b" होगा बाहर फ्लैट दुर्घटना यदि रिक्त स्थान और उद्धरण के साथ तर्क गुजर। यह कम से कम विश्वसनीय तरीका है। क्योंकि यह रिक्त स्थान और उद्धरण के साथ क्रैश नहीं करेंगे, लेकिन अगर तर्क उद्धरण से घिरा हुआ है यह मेल नहीं खाएगी

IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat "a b" 

b""=="-b" was unexpected at this time. 

[%1]==[-b] का उपयोग करना बेहतर है।

IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat "-b" 

(does not match, and jumps to UNKNOWN instead of SPECIFIC) 

"%~1"=="-b" का उपयोग करना सबसे विश्वसनीय है। %~1 यदि वे मौजूद हैं तो आसपास के उद्धरणों को बंद कर देंगे। तो यह उद्धरण के साथ और बिना काम करता है, और बिना किसी तर्क के।

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat 
C:\> run.bat -b 
C:\> run.bat "-b" 
C:\> run.bat "a b" 

(all of the above tests work correctly) 
+0

यह वर्ग ब्रैकेट का अंत नहीं है, आप देखते हैं: 'अगर [% ~ 1] == [] '- यह काम करता है, और यह' -b "' को भी संभालता है। आपको बस * अंदर * बॉक्स, एर्म, स्क्वायर [ब्रैकेट] सोचने में सक्षम होना चाहिए। –

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