पीटर मॉर्टेंसन द्वारा कोडस्मिथ के जवाब पर अपनी टिप्पणी में उद्धृत किए गए दूसरे दस्तावेज़ ने मेरे लिए चीजों को बहुत स्पष्ट कर दिया। वह दस्तावेज windowsinspired.com द्वारा लिखा गया था। इस लिंक को दोहराया गया: विंडोज कमांड लाइन आर्ग्युमेंट्स के उद्धरण और पलायन से बेहतर तरीका ।
कुछ और परीक्षण और त्रुटि निम्नलिखित दिशानिर्देशों की ओर ले जाती है:
"
एक कैरेट के साथ हर दोहरे उद्धरण से बचें ^
। आप Windows कमांड खोल करने के लिए विशेष अर्थ के साथ अन्य पात्रों चाहते हैं (जैसे, <
, >
, |
, &
) नियमित वर्ण समझ लिया करने के बजाय, फिर, एक कैरट के साथ उन्हें बचने के भी।
यदि आप चाहते हैं कि आपका प्रोग्राम foo कमांड लाइन टेक्स्ट प्राप्त करे "a\"b c" > d
और इसके आउटपुट को फाइल आउट करने के लिए रीडायरेक्ट करे । तो अपने प्रोग्राम को विंडोज कमांड शेल से निम्नानुसार शुरू करें:
foo ^"a\^"b c^" ^> d > out.txt
अगर foo\"
एक शाब्दिक दोहरे उद्धरण के रूप में व्याख्या करता है और उम्मीद करता है कि दोहराए गए तर्क को दोहराता है जिसमें व्हाट्सएप शामिल है, तो foo एक तर्क a"b c
, एक तर्क >
और एक तर्क को निर्दिष्ट करते हुए कमांड की व्याख्या करता है d
।
यदि इसके बजाय फू""
एक शाब्दिक दोहरे उद्धरण के रूप में एक दोहरे दोहरे भाव की व्याख्या करता है , तो अपना कार्यक्रम शुरू करें
foo ^"a^"^"b c^" ^> d > out.txt
उद्धृत दस्तावेज़ से मुख्य अंतर्दृष्टि यह है कि, विंडोज कमांड शेल में, एक अनसैप्ड डबल कोट ट्रिगर दो संभावित राज्यों के बीच स्विच कर रहा है।
कुछ और परीक्षण और त्रुटि का अर्थ है कि प्रारंभिक स्थिति में, पुनर्निर्देशन (एक फ़ाइल या पाइप के लिए) को मान्यता दी जाती है और एक कैरेट ^
एक दोहरे उद्धरण से बच जाता है और इनपुट से कैरेट हटा दिया जाता है। दूसरे राज्य में, पुनर्निर्देशन को मान्यता नहीं दी जाती है और एक कैरेट दोहरे उद्धरण से नहीं बचता है और इसे हटाया नहीं जाता है। आइए इन राज्यों को क्रमशः 'बाहर' और 'अंदर' के रूप में देखें।
यदि आप अपनी कमांड के आउटपुट को रीडायरेक्ट करना चाहते हैं, तो रीडायरेक्शन तक पहुँचने पर कमांड शेल बाहर की स्थिति में होना चाहिए, इसलिए रीडायरेक्शन से पहले डबल काप्स (लापरवाही से) की एक समान संख्या होनी चाहिए। foo "a\"b " > out.txt
होगा काम नहीं - आदेश खोल पूरे गुजरता है "a\"b " > out.txt
करने के लिए foo , इसका संयुक्त आदेश पंक्ति तर्क के रूप में के बजाय केवल पास करने का "a\"b "
और करने के लिए उत्पादन पुनः निर्देशित out.txt ।
foo "a\^"b " > out.txt
काम नहीं करेगा, या तो, क्योंकि कैरट ^
का सामना करना पड़ता है अंदर की स्थिति में जहां यह एक साधारण चरित्र है और बच चरित्र नहीं है, इसलिए फू"a\^"b " > out.txt
को पारित किया जाता है ।
एकमात्र तरीका यह है कि (उम्मीद है) हमेशा काम करता है कमांड शेल को हमेशा बाहर की स्थिति में रखें, क्योंकि तब पुनर्निर्देशन काम करता है।
यदि आपको पुनर्निर्देशन की आवश्यकता नहीं है (या कमांड शेल के विशेष अर्थ के साथ अन्य वर्ण), तो आप करियर के बिना कर सकते हैं। अगर फू\"
एक शाब्दिक दोहरे उद्धरण के रूप में व्याख्या करता है, तो आप इसे कॉल कर सकते हैं
foo "a\"b c"
फिर फू"a\"b c"
अपने संयुक्त तर्क पाठ के रूप में प्राप्त करता है और इसे एकल तर्क के बराबर व्याख्या कर सकता है a"b c
।
अब - अंत में - मूल प्रश्न के लिए। myscript '"test"'
विंडोज कमांड खोल गुजरता से कहा जाता है '"test"'
के लिए myscript । जाहिरा तौर पर myscript एकल और दोहरे उद्धरणों को तर्क परिसीमाक के रूप में व्याख्या करता है और उन्हें हटा देता है। आपको यह पता लगाने की आवश्यकता है कि myscript शाब्दिक दोहरे उद्धरण के रूप में क्या स्वीकार करता है और फिर ^
Windows कमांड शेल के लिए विशेष अर्थ रखने वाले किसी भी वर्ण से बचने के लिए अपने कमांड में निर्दिष्ट करें । यह देखते हुए कि myscript
यूनिक्स पर भी उपलब्ध है, शायद \"
चाल है। प्रयत्न
myscript \^"test\^"
या, यदि आपको पुनर्निर्देशन की आवश्यकता नहीं है,
myscript \"test\"
myscript \"test\"