संक्षिप्त उत्तर - वर्ग कोष्ठक का उपयोग करें:
if [%1]==[] goto :blank
या (जब आपको उद्धृत आर्गन को संभालने की आवश्यकता हो, तो नीचे संपादित देखें):
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.
बूम यह सच करने के लिए मूल्यांकन नहीं था, न ही यह गलत का मूल्यांकन किया था। स्क्रिप्ट DIED। यदि आप लाइन से नीचे रिएक्टर को बंद करने वाले थे, तो अच्छी तरह से - कठिन भाग्य। अब आप हैरी डागलियन की तरह मर जाएंगे।
आप सोच सकते हैं - ठीक है, तर्कों में उद्धरण शामिल नहीं हो सकते। यदि वे करते हैं, तो ऐसा होता है। गलत यहाँ कुछ सांत्वना है:
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.
लेकिन मुझे क्या मिलता है, जब "
-चक्र की संख्या "मैच" (यानी - सम है), ऐसे मामले में:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - मुझे आशा है कि आपने इस बारे में कुछ सीखा है कि .bat
फाइलें अपने कमांड लाइन के तर्कों को कैसे विभाजित करती हैं (HINT: * यह वास्तव में बैश की तरह नहीं है)। उपरोक्त तर्क में एक स्थान है। लेकिन उद्धरण स्वचालित रूप से छीन नहीं रहे हैं।
और अर्गक? यह उस पर कैसे प्रतिक्रिया करता है? जाहिर:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
इसलिए - कहने से पहले सोचें: "पता है क्या? बस उद्धरण का उपयोग करें। [क्योंकि, मेरे लिए, यह अच्छा लग रहा है]"।
संपादित करें
हाल ही में, इस उत्तर के बारे में टिप्पणियां थीं - ठीक है, वर्गीय कोष्ठक "उद्धृत तर्कों को पारित नहीं कर सकते हैं और उनके साथ व्यवहार कर सकते हैं जैसे कि वे उद्धृत नहीं किए गए थे।
वाक्य रचना:
if "%~1"=="" (...)
क्या दोहरे उद्धरण चिह्नों का कुछ नया पाया गया गुण नहीं है, लेकिन तर्क चर से अलग करने वाले उद्धरणों की एक स्वच्छ विशेषता का प्रदर्शन, यदि पहला और अंतिम चरित्र एक दोहरा उद्धरण है।
यह "तकनीक" वर्गाकार कोष्ठक के साथ ही काम करती है:
if [%~1]==[] (...)
यह इंगित करने के लिए एक उपयोगी बात थी, इसलिए मैं नए उत्तर को भी प्रस्तुत करता हूं।
अंत में, डबल उद्धरण प्रशंसक, ""
आपकी पुस्तक में फ़ॉर्म का एक तर्क मौजूद है, या क्या यह रिक्त है? यूं ही पूछ रहा था' ;)
GOTO BLANK
अन्य दोIF
कथनों में कोष्ठक ( पंक्ति की तरह ) जोड़ते हैं , तो क्या यह समस्या को ठीक करता है?