2016-05-19 9 views
6

बैच फ़ाइलों में विशेष वर्ण दर्द हैं, लेकिन मुझे इस विशेष स्ट्रिंग के पहले दो अक्षरों से ठीक से बचने के लिए सही कामकाज नहीं मिला है, मैं एप्लिकेशन को पास करने का प्रयास कर रहा हूं।बैच फ़ाइल में विशेष वर्ण

SET pass=^&AntiBatchfileString 
A_Program.exe /pass=%pass% 

बातें मैं कोशिश की है:

:: Escaping the escape twice, first for ^, second for &. 
SET pass=^^^^&AntiBatchfileString 
echo %pass% 

:: Combining escapes. 
SET first=^^ 
SET second=^^&AntiBatchfileString 
SET pass=%first%%second% 
echo %pass% 

:: Preventing expansion 
SET first=^^ 
SET second=^^&AntiBatchfileString 
SET pass=!first!%second% 
echo %pass% 

:: I got this to print correctly 
SET "pass=^&AntiBatchfileString" 
echo ^^%pass% 

फिर भी जब पिछले एक यह लॉगिन को स्वीकार नहीं करता गुजर, मैं नहीं जानता कि क्या अंतिम आउटपुट है। इससे मुझे लगता है कि यह एप्लिकेशन में पैरामीटर पास करते समय एक और विस्तार करने की कोशिश कर रहा था, इसलिए मैंने इसे भी उद्धृत किया।

SET "pass=^&AntiBatchfileString" 
A_Program.exe "/pass=^^%pass%" 

यह अभी भी काम नहीं कर रहा, मुझे यकीन है कि मैं क्या इस बिंदु पर याद कर रहा हूँ नहीं हूँ।

+0

[बैच कैरेक्टर एस्केपिंग] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/6828751/batch-character-escaping) –

उत्तर

5

इस मान लें कि आप स्ट्रिंग ^&AntiBatchfileString सचमुच चाहते हैं, है सबसे अच्छा set वाक्य रचना, के रूप में सबसे विशेष वर्ण (^&()<>| और भी मानक सीमांकक ,;=अंतरिक्षटैब) अपने विशेष अर्थ खो देते हैं जैसे हीके बीच थर्म को रखा जाता है, और "" स्वयं वेरिएबल मान का हिस्सा नहीं बनते:

set "pass=^&AntiBatchfileString" 

यह केवल जब तक आदेश एक्सटेंशन पर काम करता है, जो Windows डिफ़ॉल्ट वैसे भी (प्रकार cmd /? और /E विकल्प देखें)।

"%pass%" ("" संलग्न करने के साथ) एक चर का विस्तार (पढ़ना), विशेष वर्णों का अभी भी शाब्दिक व्यवहार किया जाता है।

हालांकि, जैसे ही आप इसे %pass% ("") जैसे विस्तारित करते हैं, वे अपना विशेष अर्थ वापस लेते हैं। तो अगर आप निम्न विकल्प हैं:

  1. उपयोग set "pass=^^^&AntiBatchfileString", जहां ^^ निकल जाता शाब्दिक ^ और ^& शाब्दिक & जब %pass% की तरह पढ़ने।
  2. देरी विस्तार को सक्षम करें (set /? देखें कि यह कैसे काम करता है और setlocal /? या cmd /? इसे सक्षम करने के तरीके के बारे में), जहां वैरिएबल मान का विस्तार किया जाता है (पढ़ा जाता है) जहां विशेष वर्णों का पार्सिंग पूरा हो चुका है।

मैं, बाद दृष्टिकोण पसंद करते हैं क्योंकि कोई विशेष एस्केपिंग आवश्यक है, और यह भी " स्ट्रिंग मान (यहां तक ​​कि unsymmetrically मौजूद होने पर) में प्रदर्शित होने के साथ सौदा कर सकते हैं।
वैसे, "^" से भी बच निकला जा सकता है, जब तक यहसे अनदेखा नहीं होता है।

फिर भी, % संकेत एक बैच फ़ाइल में ^% तरह बच गए नहीं किया जा सकता है, लेकिन आप या नहीं, स्ट्रिंग "" के बीच में है एक शाब्दिक एक-एक, स्वतंत्र पाने के लिए उन्हें %% तरह दोगुना करने की जरूरत है।
ध्यान दें कि कंसोल पर, %% काम नहीं करता है हालांकि ^% करता है। (इसलिए यह केवल जब सक्षम करने के लिए

अंत में, शाब्दिक ! देरी विस्तार सुविधा द्वारा सक्षम किए जाने पर खपत होती है, इसलिए आप समझदारी से देरी विस्तार टॉगल करके ^! की तरह उनमें से बचने के लिए, या भी द्वारा, मामले में उन लोगों के लिए विशेष रूप से ध्यान देने की आवश्यकता वास्तव में इसकी आवश्यकता होती है और इसे अन्यथा अक्षम करने के लिए, जब एक शाब्दिक स्ट्रिंग प्रदान की जाती है, जैसे set कमांड लाइन, उदाहरण के लिए, %pass% जैसे मानक चर का विस्तार करते समय और %%I (बैच फ़ाइल) या %I (कंसोल)), उदाहरण के लिए)। बेशक यह अंतिम समाधान भी नहीं है, क्योंकि आपको setlocal और endlocal की आवश्यकता है ताकि विलंब विस्तार को सक्षम/अक्षम किया जा सके, जिसका उद्देश्य पर्यावरण परिवर्तनों को स्थानांतरित करना है, इसलिए setlocal कमांड के बाद से कोई भी परिवर्तनीय परिवर्तन endlocal निष्पादित हो गया है (हालांकि endlocal अवरोध पर परिवर्तनीय मान को पार करने के लिए कुछ युक्तियां हैं)।

+0

आह मैं अब देखता हूं, इसके साथ-साथ इसके साथ झुकाव के बाद भी मुझे एहसास नहीं हुआ कि मैं अन्य सामानों की कोशिश करते समय इस भाग को "/ pass =% pass%" में छोड़ दिया। यह अब काम कर रहा है और सुझावों के लिए धन्यवाद, @aschipfl! –

संबंधित मुद्दे