संक्षिप्त उत्तर वर्गाकार कोष्ठकों का उपयोग
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]==[] (...)
यह इस का कहना है के लिए एक उपयोगी बात थी, तो मैं भी नया उत्तर वोट दें।
आखिरकार, डबल कोट प्रशंसकों, ""
फ़ॉर्म की एक तर्क आपकी पुस्तक में मौजूद है, या यह खाली है? बस पूछें ';
आप अन्य दो 'IF' बयान करने के लिए (' गोटो BLANK' लाइन में की तरह) कोष्ठक जोड़ते हैं तो वह इस समस्या को ठीक करता है? –