मैं बैच फ़ाइलों में एम्परसेंड कैसे बचूँ?


146

startURL में एम्परसेंड के साथ वेब पेज खोलने के लिए कमांड का उपयोग करने के लिए मैं एक बैच फ़ाइल (या विंडोज कमांड लाइन से) में एम्परसेंड कैसे बचता हूं ?

डबल उद्धरण के साथ काम नहीं करेगा start; इसके बजाय एक नई कमांड-लाइन विंडो शुरू होती है।

अद्यतन 1 : वेल डल्लौल का समाधान काम करता है। इसके अलावा, अगर URL में URL एनकोडेड कैरेक्टर (जैसे स्पेस 20% के रूप में एन्कोडेड है) और यह एक बैच फ़ाइल में है तो '%' को '%%' के रूप में एनकोड किया जाना चाहिए। उदाहरण में ऐसा नहीं है।

उदाहरण, कमांड लाइन से ( CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

में परिणाम होगा

http://www.google.com/search?client=opera 

डिफ़ॉल्ट ब्राउज़र और कमांड लाइन विंडो में इन त्रुटियों को खोला जा रहा है:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

प्लेटफ़ॉर्म: Windows XP 64 बिट SP2।


1
मैंने बेलुगाब के उत्तर को संपादित किया है इसलिए इसे अभी काम करना चाहिए। यह सिर्फ एक विचित्रता है startजिसमें तर्क को उद्धृत करने का कारण बनता है यदि बिना सोचे-समझे लागू किया जाए। और कुल मिलाकर मुझे लगता है कि उद्धरणों में तर्क को घेरना आसान और कम त्रुटि वाला है, जिससे हर उस चरित्र को बचाना है जिसमें वहां भागने की जरूरत है।
जॉय

प्लस के बारे में +क्या मुझे बचने के लिए सामने रखना चाहिए?
विलियम

PowerShell में start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"काम करता है क्योंकि PowerShell उद्धरणों को बाहर निकाल देगा
phuclv

जवाबों:


91

एक cmd से :

  • &इस तरह से बच जाता है: ^&(@Wael Dalloul के उत्तर पर आधारित )
  • % भागने की जरूरत नहीं है

एक उदाहरण:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

एक बैच फ़ाइल से

  • &इस तरह से बच जाता है: ^&(@Wael Dalloul के उत्तर पर आधारित )
  • %इस तरह से बच जाता है: %%(ओपी अपडेट के आधार पर)

एक उदाहरण:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

इसमें "%" से बचने का एक उदाहरण भी शामिल हो सकता है - फिर मैं अपने सवाल को साफ कर सकता हूं।
पीटर मोर्टेनसेन

@PeterMortensen निश्चित रूप से - मैंने अपना उत्तर अपडेट कर दिया है।
लास क्रिस्टियनसन

2
मुझे किन पात्रों से बचना चाहिए? मैंने देखा कि मुझे बचना है "|" द्वारा "^ |"
शराब

इस मामले में %बचने की आवश्यकता नहीं है, क्योंकि 20andपर्यावरण चर के रूप में परिभाषित करने के लिए कौन मूर्खतापूर्ण होगा ? यदि आप करते हैं, इसके बजाय start http://www.google.com/search?q=ampersand%20and%20percentageलिंक कर सकते हैं http://www.google.com/search?q=ampersandsomething-silly20percentage^%Cmd में भागने का उपयोग करते हुए , उदाहरण उम्मीद के मुताबिक काम करता है।
तम्माक्ग्लिन

145

&अलग कमांड के लिए प्रयोग किया जाता है। इसलिए आप ^बचने के लिए उपयोग कर सकते हैं &


3
प्लस के बारे में +क्या मुझे बचने के लिए सामने रखना चाहिए?
विलियम

यह अधिक सामान्य लागू समाधान है। यदि कमांड-लाइन प्रोग्राम के पैरामीटर में एक या अधिक एम्परसेंड हैं तो यह भी काम करता है। मुझे बस इसका सामना करना पड़ा - पैरामीटर CGW5COMM & 10C4 और 8301 था
पीटर मोर्टेनसेन

एक एम्परसेंड को कैरट कैरेक्टर के साथ उद्धृत करना ^ सभी परिस्थितियों में काम नहीं करता है। उदाहरण के लिए, msdeploy.exe को / p: एक एम्परसेंड के साथ पासवर्ड पास करने के लिए स्विच करने का प्रयास, मेरे द्वारा आजमाए गए किसी भी क्रमपरिवर्तन के साथ काम करने के लिए नहीं लगता है (कैरट उद्धरण, दोहरे उद्धरण, डमी पहले तर्क)।
डेरेक ग्रीर

3
उपयोग करने का एक उदाहरण ^अमूल्य होगा।
jpmc26

2
@ jpmc26 मैंने इस उत्तर में एक उदाहरण जोड़ा है ।
लास क्रिस्टियनसेन

29

आप इसे उद्धरण में संलग्न कर सकते हैं, यदि आप एक डमी पहला तर्क देते हैं।

ध्यान दें कि आपको इस मामले में एक डमी पहले तर्क की आपूर्ति करने की आवश्यकता है, क्योंकि startपहले तर्क को नए कंसोल विंडो के लिए एक शीर्षक के रूप में माना जाएगा, अगर यह उद्धृत किया गया है। तो निम्नलिखित काम करना चाहिए (और यहाँ करता है):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

ठीक है, मैं मानता हूं कि शीर्षक पूरी तरह से अंदर के प्रश्न से मेल नहीं खाता है। (क्या आपको लगता है कि मुझे यह शीर्षक लंबा करना चाहिए?)
पीटर मोर्टेंसन

ऐसा नहीं 'दोह', आखिरकार - उद्धरणों में संलग्न करना सही विचार था - बस कंसोल विंडो शीर्षक चीज के बारे में नहीं पता था। धन्यवाद जोहान्स!
बेलुगबोब

PowerShell तर्कों से उद्धरणों को छीन लेगा , इसलिए यह विफल हो जाएगा। आपको केवल start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"PowerShell
phuclv


12

आदेश

echo this ^& that

उम्मीद के मुताबिक काम करता है, आउटपुट

this & that

आदेश

echo this ^& that > tmp

"tmp" फाइल करने के लिए स्ट्रिंग लिखने का भी काम करता है। हालांकि, एक पाइप से पहले

echo this ^& that | clip

^ की व्याख्या पूरी तरह से अलग है। यह दो कमांड "इको इस" और "उस" पाइप के आउटपुट को लिखने की कोशिश करता है। प्रतिध्वनि तब काम करेगी जब "वह" त्रुटि देगा। कह रही है

echo this ^& echo that | clip

क्लिपबोर्ड पर "यह" और "वह" तार डाल देंगे।

बिना ^

echo this & echo that | clip

पहला इको कंसोल को लिखेगा और केवल दूसरी इको के आउटपुट को क्लिप करने के लिए पाइप किया जाएगा (इसी तरह "> टैम्प" रीडायरेक्शन के लिए)। इसलिए, जब आउटपुट को पुनर्निर्देशित किया जा रहा है, तो ^ को उद्धृत नहीं करता है और इसके बजाय इसके बाद पुनर्निर्देशन से पहले लागू होने का कारण बनता है।

A & पाइप करने के लिए, आपको इसे दो बार उद्धृत करना होगा

echo this ^^^& that | clip

यदि आप एक चर में स्ट्रिंग डालते हैं

set m=this ^& that

फिर

set m

उत्पादन होगा

m=this & that

लेकिन स्पष्ट है

echo %m%

विफल रहता है, क्योंकि Windows चर का विकल्प देता है, जिसके परिणामस्वरूप

echo this & that

यह इसे एक नई कमांड के रूप में पेश करता है और "उस" को निष्पादित करने की कोशिश करता है।

एक बैच फ़ाइल में, आप विलंबित विस्तार का उपयोग कर सकते हैं :

setlocal enableDelayedExpansion
echo !m!

एक पाइप के आउटपुट के लिए, हमें सभी & s को वैरिएबल वैल्यू में ^ & से बदलना होगा, जिसे हम% VAR: FROM = TO% सिंटैक्स के साथ कर सकते हैं:

echo !m:^&=^^^&! | clip

कमांड लाइन पर, "cmd / v" विलंबित विस्तार को सक्षम बनाता है:

cmd /v /c echo !m!

पाइप से लिखते समय भी यह काम करता है

cmd /v /c echo !m! | clip

सरल।


पाइप के लिए आपका समाधान काम करता है, लेकिन आपके निष्कर्ष कम या ज्यादा गलत हैं। Btw। एक साधारण echo this ^^^& that | clipकाम भी। मैजिक पाइप हैंडलिंग को समझने के लिए आप SO
जेब

1

यदि आपको echoएक स्ट्रिंग की आवश्यकता है जिसमें एक एम्परसेंड शामिल है, तो उद्धरण मदद नहीं करेगा, क्योंकि आप उन्हें आउटपुट पर भी देखेंगे। ऐसे मामले में, उपयोग करें for:

for %a in ("First & Last") do echo %~a

... एक बैच स्क्रिप्ट में:

for %%a in ("First & Last") do echo %%~a

या

for %%a in ("%~1") do echo %%~a

0

यदि आपके पास फ़ाइल के नाम पर स्थान है और आपके पास एक ऐसा पात्र है, जिससे आपको बचना है:

आप कमांड में किसी भी मिसनोमर्स से बचने के लिए सिंगल और डबल कोट्स का उपयोग कर सकते हैं।

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

^चरित्र अन्यथा उद्धरण निकल जाता है।

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