भागने के उद्धरण और दोहरे उद्धरण


94

मैं -paramनिम्नलिखित कमांड लाइन में मूल्य में उद्धरणों को कैसे ठीक से छोड़ सकता हूं ?

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 

बेशक यह विफल हो जाता है। मैंने भागने वाले चरित्र का उपयोग करके उद्धरणों (एकल और दोहरे) से बचने की कोशिश की `और विभिन्न संयोजन किए, लेकिन कुछ भी काम नहीं कर रहा है।



@PeterMortensen को इस लेख के साथ समस्या है, यह है कि एक बेहतर तरीका प्रतीत नहीं होता है, जब आप एक देशी एप्लिकेशन लॉन्च करना चाहते हैं और एक पैरामीटर पास करना चाहते हैं जिसमें एक तर्क के रूप में एक डबल उद्धरण शामिल है
एंड्रयू सविनाख

@ एंड्री सविनयख: इसका एक तरीका यह है कि इसे cmd के माध्यम से लॉन्च किया जाए $someCommandStringWithDoubleQuotes | cmd:। यह वास्तव में PowerShell स्क्रिप्ट्स से काम करता है (उदाहरण के लिए CMake (जिसमें दोहरे उद्धरण चिह्नों की आवश्यकता होती है) (अन्यथा यह चुपचाप विफल हो जाएगा))। CMD का एक विकल्प है bash.exe ( MinGW ) - लेकिन यह कुछ परिस्थितियों में शुरू करने के लिए बहुत, बहुत धीमा हो सकता है।
पीटर मॉर्टेंसन

जवाबों:


59

इस तरह से बचने के पैरामीटर आमतौर पर निराशा का स्रोत होते हैं और बहुत समय बर्बाद होने जैसा महसूस होता है। मुझे लगता है कि आप v2 पर हैं, इसलिए मैं एक ऐसी तकनीक का उपयोग करने का सुझाव दूंगा जोएल "जयकुल" बेनेट ने कुछ समय पहले ब्लॉग किया था

लंबी कहानी छोटी: आप अपनी स्ट्रिंग को @ '...' @ से लपेटें:

Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@

(ध्यान रखें कि मैंने मान लिया था कि किन उद्धरणों की आवश्यकता है, और किन चीजों से आप बचने की कोशिश कर रहे हैं।) यदि आप आउटपुट के साथ काम करना चाहते हैं, तो आप -NoNewWindowस्विच को जोड़ना चाह सकते हैं ।

BTW: यह इतना महत्वपूर्ण मुद्दा था कि v3 के बाद से आप --%PowerShell parser को अपने मापदंडों के साथ कुछ भी करने से रोकने के लिए उपयोग कर सकते हैं :

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"

... वहाँ (समान धारणा के साथ) ठीक काम करना चाहिए।


आपको जवाब के लिए धन्यवाद। स्टार्ट-प्रोसेस कोई फर्क नहीं पड़ता कि मैंने कैसे कोशिश की हमेशा शिकायत की। तो मैंने cmd / C $ cmd किया (जहाँ $ cmd मेरी पूरी कमांड है .exe सहित।)। मैं शक्तियाँ 2.0 का उपयोग कर रहा हूँ। यहां तक ​​कि अगर मैं सही ढंग से याद है यहाँ भी स्ट्रिंग काम नहीं किया।
ईटाविल

3
दोहरे उद्धरण चिह्नों से बचने के लिए बैकटिक (`) का उपयोग करने की तुलना में यह अनावश्यक रूप से जटिल लगता है।
नाविक

6
जब तक आप नियमों की अपेक्षा करते हैं, तब तक यह बढ़िया काम करता है। पहले @ 'को "लाइन 1" पर होना चाहिए, आपका पैरामीटर "लाइन 2" पर होना चाहिए और अंत में "@ को" लाइन 3 "पर होना चाहिए। इससे पहले समाप्त होने वाले @ में रिक्त स्थान नहीं हो सकते। आदमी इस वाक्यविन्यास picky है!
इयान न्यूलैंड

बहुत अच्छा काम करता है! यदि आपको अपनी स्ट्रिंग में चर का विस्तार करने की आवश्यकता है, तो आप उपयोग कर सकते हैं @"और "@इसके बजाय।
browly

96

अगर मैं उन्हें निम्न स्थानों पर रखता हूं तो मेरे लिए बैकटिक (`) का उपयोग करना ठीक रहता है:

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""

$cmd रिटर्न के रूप में:

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"

क्या आप इसी की तलाश में हैं?

PowerShell ने मुझे एक अनपेक्षित टोकन 'सॉर्ट 1' के लिए संदर्भित किया, और यही कि मैंने यह निर्धारित किया कि बैकटिक्स को कहां रखा जाए।

@ '...' @ सिंटैक्स को "यहां स्ट्रिंग" कहा जाता है और जो दर्ज किया गया है, वही लौटेगा। आप निम्नलिखित फैशन में चर को पॉप्युलेट करने के लिए भी उनका उपयोग कर सकते हैं:

$cmd=@'
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@

जैसा कि ऊपर दिखाया गया है उद्घाटन और समापन प्रतीकों को अपनी लाइन पर होना चाहिए।


देरी के लिए क्षमा करें ... जिस तरह से मैंने इसे बनाया है वह आखिरकार cmd / C "MYCOMMAND" को पॉवरशेल से कॉल करना है। यह सीधे पॉवरशेल का उपयोग करके काम नहीं करता था।
ईटाविल

1
लेकिन जब इसे लागू किया जाता है तो Invoke-Expressionदोहरे उद्धरण चिह्नों को नहीं $cmdहटाता है? या आपने $cmdबिना उपयोग कैसे किया Invoke-Expression?
पीटर मोर्टेंसन

8

मैंने आज खुद को एक समान विधेय में पाया, जबकि एक नोड.जेएस मॉड्यूल के माध्यम से एक कमांड चलाने की कोशिश की:

मैं PowerShell का उपयोग कर रहा था और चलाने की कोशिश कर रहा था:

command -e 'func($a)'

लेकिन अतिरिक्त प्रतीकों के साथ, पावरशेल तर्कों का प्रबंधन कर रहा था। ठीक करने के लिए, मैं बैक-टिक दोहरे उद्धरण चिह्नों से बच गया:

command -e `"func($a)`"

2
दिलचस्प: "['`"][^'`"]['`"]"काम करता है ... लेकिन '[`'"][^`'"][`'"]'नहीं करता है! मुझे पागल कर रहा था
डेविड जे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.