पैरामीटर में दोहरे उद्धरण चिह्नों से बचें


109

यूनिक्स में मैं दौड़ सकता था myscript '"test"'और मुझे मिलेगा "test"

विंडोज में cmdमुझे मिलता है 'test'

मैं एक पैरामीटर के रूप में दोहरे उद्धरण कैसे पास कर सकता हूं? मैं यह जानना चाहूंगा कि यह मैन्युअल रूप से एक cmdविंडो से कैसे किया जाए ताकि मुझे अपने कार्यक्रम का परीक्षण करने के लिए एक कार्यक्रम लिखना न पड़े।


2
यह एक साल हो गया है जब मैंने एक विंडोज़ मशीन को छुआ है, लेकिन क्या मानक बच चरित्र (बैकस्लैश \) काम नहीं करता है? जैसेmyscript \"test\"
गजलर

नहीं। मुझे \ test \ _ मिलता है। मुझे संदेह है कि क्योंकि विंडोज़ का उपयोग करता है / इसलिए बैकस्लैश का उपयोग एस्केपर के रूप में नहीं किया जा सकता है। लेकिन मैं वास्तव में नहीं जानता।
ब्रायन फील्ड

Idk आप किस विंडोज के संस्करण का उपयोग कर रहे हैं, लेकिन \ "विंडोज 7 (अल्टीमेटल) पर ठीक काम करता है। हालांकि, इसे करने का एक और तरीका है, कई कोट्स (यानी" "" "या कुछ") से निपटना, लेकिन मैं नहीं कर सकता यह कब और कैसे काम करता है यह पता लगाएं।
कोडस्मिथ

जवाबों:


22

मैं जल्दी से लक्षणों को पुन: पेश नहीं कर सकता: अगर मैं myscript '"test"'एक बैच फ़ाइल के साथ कोशिश करता हूं myscript.batजिसमें सिर्फ @echo.%1या सिर्फ एक ही है @echo.%~1, तो मुझे सभी उद्धरण मिलते हैं:'"test"'

शायद आप ^इस तरह से भागने के चरित्र की कोशिश कर सकते हैं myscript '^"test^"':?


3
तो हो सकता है कि इस सवाल के जवाब आगे आपकी मदद करें?
मूसियो

2
हा! मुझे लगता है कि यह wscriptगलती थी कभी नहीं होगा ! इसे विंडोज पर छोड़ दें :)
ब्रायन फील्ड

4
वास्तव में ^ ने मेरे लिए काम नहीं किया, लेकिन \ _ ने किया, इस जवाब के अनुसार: stackoverflow.com/questions/2403647/…
kalenjordan

26
विंडोज: ओएस जहां ग्लोबिंग, शेल विस्तार, और पैरामीटर अनसेस्टिंग शेल के बजाय निष्पादित निष्पादन योग्य द्वारा किया जाता है। आप कभी नहीं जानते कि कौन सा सम्मेलन, यदि कोई हो, तो निष्पादित निष्पादन योग्य सम्मान।
बिंकी

7
मूल्यवान इनपुट: blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/… । कैरेट वास्तव में पसंद का एस्केप कैरेक्टर है cmd
पीटर - मोनिका

198

उद्धरण से बचने का एक और तरीका (हालांकि शायद बेहतर नहीं है), जिसे मैंने कुछ स्थानों पर उपयोग किया है, कई दोहरे उद्धरण चिह्नों का उपयोग करना है । अन्य लोगों के कोड को सुपाठ्य बनाने के उद्देश्य से, मैं समझाता हूँ।

यहाँ बुनियादी नियमों का एक सेट है:

  1. जब डबल-कोटेड समूहों में लिपटे नहीं, रिक्त स्थान अलग पैरामीटर:
    program param1 param2 param 3करने के लिए चार मापदंडों पारित करेंगे program.exe:
         param1, param2, param, और 3
  2. एक डबल-कोटेड समूह मूल्य विभाजक जब कार्यक्रमों के लिए पैरामीटर प्रदान करने के रूप में रिक्त स्थान पर ध्यान नहीं देता:
    program one two "three and more"करने के लिए तीन मापदंडों पारित करेंगे program.exe:
         one, two, और three and more
  3. अब कुछ भ्रम की व्याख्या करने के लिए:
  4. डबल-उद्धरण वाले समूह जो सीधे पाठ से सटे दिखाई देते हैं, दोहरे उद्धरणों के साथ लिपटे नहीं होते हैं, एक पैरामीटर में शामिल होते हैं:
    hello"to the entire"worldएक पैरामीटर के रूप में कार्य करता है helloto the entireworld:।
  5. नोट: पिछले नियम का अर्थ यह नहीं है कि दो दोहरे-उद्धृत समूह सीधे एक दूसरे से सटे दिखाई दे सकते हैं।
  6. किसी बंद उद्धरण का सीधे अनुसरण करने वाले किसी भी दोहरे-उद्धरण को (या उसके हिस्से के रूप में) सादे अलिखित पाठ के रूप में माना जाता है, जो दोहरे-उद्धरण समूह के समीप है, लेकिन केवल एक डबल-उद्धरण:
    "Tim says, ""Hi!"""एक पैरामीटर के रूप में कार्य करेगा:Tim says, "Hi!"

इस प्रकार तीन अलग-अलग प्रकार के दोहरे-उद्धरण हैं: उद्धरण जो खुलते हैं, जो बंद होते हैं, और उद्धरण जो सादे-पाठ के रूप में कार्य करते हैं।
यहाँ उस अंतिम भ्रामक रेखा का टूटना है:

"खुला डबल-उद्धरण समूह
T अंदर "" है
मैं अंदर "" s
मी "" के अंदर
    अंदर "" स्थान अलग नहीं होता है
s "" के अंदर है
एक अंदर "" है
y अंदर "" है
s "" के अंदर है
, "" के अंदर
    अंदर "" स्थान अलग नहीं होता है
"करीब दो-उद्धृत समूह
"उद्धरण सीधे करीब है - सादे अलिखित पाठ के रूप में कार्य करता है:"
H "" s - पिछले समीपवर्ती समूह में शामिल हो जाता है
मैं बाहर "" - ...
! बाहर "" - ...
"खुला डबल-उद्धरण समूह
"करीब डबल-उद्धरण समूह
"उद्धरण सीधे करीब है - सादे अलिखित पाठ के रूप में कार्य करता है:"

इस प्रकार, पाठ प्रभावी रूप से वर्णों के चार समूहों में शामिल हो जाता है (एक के साथ कुछ नहीं, हालांकि):
Tim says,  पहला है, रिक्त स्थान से बचने के लिए लिपटे
"Hi!दूसरा है, लिपटे नहीं है (कोई रिक्त स्थान नहीं हैं)
 तीसरा है, एक दोहरे उद्धरण वाला समूह कुछ भी नहीं लपेटता है
"चौथा है, अलिखित पास की बोली।

जैसा कि आप देख सकते हैं, डबल-उद्धरण समूह रैपिंग कुछ भी अभी भी आवश्यक नहीं है, इसके बिना, निम्नलिखित डबल-उद्धरण सादे-पाठ के रूप में कार्य करने के बजाय एक दोहरे-उद्धरण समूह को खोल देगा।

इस से, यह पहचानने योग्य होना चाहिए कि इसलिए, उद्धरण के अंदर और बाहर, तीन दोहरे-उद्धरण एक सादे-पाठ के रूप में कार्य करते हैं, जो दोहरे उद्धरण-चिह्नों से मुक्त होते हैं:

"टिम ने उससे कहा," "हाल ही में क्या हो रहा है?" ""

Tim said to him, "What's been happening lately?"अपेक्षा के अनुसार प्रिंट होगा । इसलिए, तीन उद्धरण हमेशा बच निकलने के रूप में मज़बूती से उपयोग किए जा सकते हैं।
हालाँकि, इसे समझने में, आप यह नोट कर सकते हैं कि अंत में चार उद्धरण केवल एक दो तक कम किए जा सकते हैं क्योंकि यह तकनीकी रूप से एक और अनावश्यक खाली-दोहरे समूह को जोड़ रहा है।

इसे बंद करने के लिए यहां कुछ उदाहरण दिए गए हैं:

कार्यक्रम अब रे भेजता (ए) और (बी)
कार्यक्रम "" "ए" "आरईएम भेजता है (" ए)
कार्यक्रम "" "ए बी" "" आरईएम भेजता है ("ए) और (बी")
कार्यक्रम "" "हैलो," "" माइक ने कहा। रेम भेजता है ("हैलो," माइक ने कहा।)
कार्यक्रम "" "ए" बी "" सी "" डी "" आरईएम भेजता है (एबीसीडी) क्योंकि "" समूह कुछ भी नहीं लपेटते हैं
कार्यक्रम "हैलो" से "" उद्धरण "" REM भेजता (हैलो "उद्धरण")
कार्यक्रम "" "" हैलो दुनिया "" REM भेजता ("हैलो दुनिया")
कार्यक्रम "" "हैलो" दुनिया "" REM भेजता ("हैलो दुनिया")
कार्यक्रम "" "हैलो" दुनिया "" REM भेजता ("हैलो) और (दुनिया")
कार्यक्रम "हैलो" "दुनिया" "" REM भेजता है (हैलो "दुनिया")
कार्यक्रम "हैलो" "" दुनिया "" REM भेजता है (हैलो "दुनिया")

अंतिम नोट: मैंने इनमें से किसी भी ट्यूटोरियल से नहीं पढ़ा है - मैं इसे प्रयोग करके आया। इसलिए, मेरा स्पष्टीकरण आंतरिक रूप से सही नहीं हो सकता है। फिर भी, ऊपर दिए गए सभी उदाहरण दिए गए हैं, इस प्रकार मेरे सिद्धांत का सत्यापन (लेकिन साबित नहीं) है।

मैंने इसका परीक्षण विंडोज 7 पर किया, 64 बिट केवल * .exe कॉल का उपयोग करते हुए पैरामीटर पासिंग के साथ (* .bat नहीं, लेकिन मुझे लगता है कि यह वही काम करता है)।


11
+1, लेकिन ध्यान दें कि यह व्यवहार अनुप्रयोग पर निर्भर करता है। विंडोज में, प्रत्येक एप्लिकेशन अपने स्वयं के कमांड लाइन मापदंडों को पार्स करता है। मेरा मानना ​​है कि आप जिस व्यवहार का वर्णन कर रहे हैं, वह माइक्रोसॉफ्ट के मानक सी लाइब्रेरी का है, जो मुझे लगता है कि अधिकांश अन्य विंडोज सी कंपाइलरों द्वारा भी नकल की जाती है।
हैरी जॉनसन

3
आपके पिछले एक्सप्रेशन में कई त्रुटियां। कार्यक्रम "" "ab" "-> (" ab "), कार्यक्रम" hello to "" "quotes" "-> (hello to" quotes), कार्यक्रम "" "hello world" "-> (" Hello) " (दुनिया), कार्यक्रम "" "नमस्ते" दुनिया "" -> ("नमस्ते) (दुनिया), कार्यक्रम" "" नमस्ते "दुनिया" "-> (" नमस्ते दुनिया), कार्यक्रम "हैलो" "" दुनिया "" - > (हैलो "दुनिया)
थॉमसन

46
... मैं बस इतना कह सकता हूं कि विंडोज बैच की फाइलों में समस्याएं हैं। यह मसीह के लिए उद्धरण से बच रहा है ; यह रॉकेट विज्ञान के कुछ प्रकार होना चाहिए नहीं है।
जेम्स को

4
@JamesKo मैं अधिक सहमत नहीं हो सका। Windows कमांड लाइन की रहस्यमयी असावधानी और असंगतता मुझे कभी गुस्सा नहीं दिलाती। इस कबाड़ को किसने डिजाइन किया? ओह, वर्षों में बर्बाद कर दिया घंटे! यूनिक्स इतना आसान है और तुलना में बहुत समझ में आता है।
कार्लोस ए।


24

इसे इस्तेमाल करे:

myscript """test"""

"" पैरामीटर में एक से बच "।


1
यह बिल्कुल सही नहीं है। कोशिश करो myscript """test test"""और यह काम नहीं करता है (पहले पैरामीटर के रूप में सौंप दिया गया है "test। पूरी तरह से, आपको तीन उद्धरणों की आवश्यकता है: myscript """"test test""अंत में तीसरी बोली को छोड़ दिया जा सकता है, हालांकि।
इगुनिटर

क्या होगा अगर मुझे यहां सभी उद्धरणों को हटाने और एक चयनित क्वेरी फ़िल्टर में उपयोग किए जाने वाले स्ट्रिंग में पैरामीटर मान रखने की आवश्यकता है? क्या कोई मदद कर सकता है?
SFDC_Learner

2
हो सकता है कि इस प्रश्न के लिए हाजिर न हों, लेकिन इससे मुझे मदद मिली जब मुझे char **argvअपने सी लॉन्चर से किसी अन्य प्रक्रिया में spawnया जैसे कार्यों का उपयोग करके पास होने की आवश्यकता हुई exec। धन्यवाद। :-)
विराट

2

पीटर मॉर्टेंसन द्वारा कोडस्मिथ के जवाब पर अपनी टिप्पणी में उद्धृत किए गए दूसरे दस्तावेज़ ने मेरे लिए चीजों को बहुत स्पष्ट कर दिया। वह दस्तावेज 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\"

धन्यवाद! मैं दीवार पर अपना सिर पीट रहा था, जिसमें cmd ​​प्रॉम्प्ट टेक्स्ट के साथ एक vbscript चलाने की कोशिश की जा रही थी, जिसे cmd प्रॉम्प्ट टेक्स्ट में प्रतिध्वनित किया जा रहा था - मुझे यह विरासत में मिला - और उद्धरणों से बचने का एक तरीका नहीं समझ सका।
पोपडरेन

0

मैं cmd ​​से पॉवरशेल, और पासिंग कोट्स कह रहा हूं और न ही यहां काम करता हूं। कब्र उच्चारण इस विन 10 सतह प्रो पर दोहरे उद्धरण चिह्नों से बचने के लिए काम किया।

>powershell.exe "echo la`"" >> test
>type test
la"

नीचे दिए गए आउटपुट मैं एक दोहरे उद्धरण से बचने के लिए अन्य पात्रों के लिए है:

la\
la^
la
la~

एक उद्धरण से बचने के लिए दूसरे उद्धरण का उपयोग करने से कोई उद्धरण नहीं हुआ। जैसा कि आप देख सकते हैं, अक्षर खुद टाइप हो गए, लेकिन दोहरे उद्धरण चिह्नों से बच नहीं पाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.