2016-09-27 6 views
5

समस्याकिसी बैच फ़ाइल में पैरामीटर को कैसे पास किया जाए जिसमें बिना 'ब्रेकिंग' है?

एक मुख्य बैच फ़ाइल में, मान एक .txt फ़ाइल (और SET इस बैच फ़ाइल में चरों के मान के रूप में) से लिए जाते हैं। इन मानों में प्रत्येक में % वर्ण हो सकते हैं।

ये किसी भी समस्या के साथ .txt फ़ाइल से पढ़े जाते हैं। हालांकि, जब % वर्ण वाले मान वाले चर को दूसरी बैच फ़ाइल में पास किया जाता है, तो दूसरी बैच फ़ाइल किसी भी % अक्षरों को परिवर्तनीय विस्तार के रूप में व्याख्या करती है। (नोट:। वहाँ दूसरा बैच फ़ाइल पर कोई नियंत्रण है)

उदाहरण

echo %PERCENTVARIABLE% 

आउटपुट: I%LOVE%PERCENT%CHARACTERS%

जब एक दूसरे फाइल करने के लिए पारित कर दिया और उसके बाद echo'ed , (शायद)IPERCENT बन गया, क्योंकि यह %LOVE% और %CHARACTERS% को अनसेट चर के रूप में व्याख्या करता है।


रिसर्च

मैं, खोजने के लिए और एक बैच फ़ाइल में एक स्ट्रिंग के भीतर तत्वों को बदलने के लिए वाक्य रचना पाया के रूप में मैंने सोचा कि मैं संभावित है ताकि इसे से बचने के लिए में %% के साथ एक % चरित्र बदल सकते थे। हालांकि मैं इसे काम नहीं कर सकता।

वाक्य रचना है -

set string=This is my string to work with. 
set string=%string:work=play% 
echo %string% 

कहाँ उत्पादन तो This is my string to play with. होगा।


प्रश्न

  1. इसे खोजने का उपयोग कर % वर्ण से बचें और एक चर में वाक्य रचना को बदलने के लिए संभव है? (यदि नहीं, तो क्या कोई और तरीका है?)
  2. क्या ऐसा करने की सलाह दी जाती है? (इन बचने वाले वर्णों का उपयोग करके दूसरी बैच फ़ाइल में कोई समस्या हो सकती है (जैसा ऊपर बताया गया है) पर हमारा कोई नियंत्रण नहीं होगा?)
  3. क्या इस समस्या को संभालने का कोई और तरीका है, यदि उपरोक्त संभव नहीं है?
+3

फ़ाइल को 'jrepl.bat' से dbenham द्वारा संसाधित किया जा सकता है यदि कार्य हेरफेर के लिए उपयुक्त है। jrepl jscript का उपयोग करता है और 'जहर वर्ण' को संभाल सकता है। – foxidrive

+0

@foxidrive क्या आप जानते हैं कि इससे पहले स्क्रिप्ट में परिवर्तनीय मानों का उपयोग कैसे प्रभावित होगा? वेरिएबल्स दोनों की पहली स्क्रिप्ट में उपयोग किया जाएगा (हमारे पास नियंत्रण है) और एक सेकंड (हमारे नियंत्रण में नहीं) – Eilidh

+0

तक "दूसरी फ़ाइल में गुज़रने" के माध्यम से, आप इसका मतलब है 'कॉल' का उपयोग करके इसे कॉल करना? – aschipfl

उत्तर

1

हो सकता है ...?

input.txt

I%LOVE%PERCENT%CHARACTERS% 

batch1।बल्ले

@echo off 
setlocal enableDelayedExpansion 
set/P var=<input.txt 
echo(In batch 1 var content: %var% 

set "var=!var:%%=%%%%!" 
call batch2.bat "%var%" 
endlocal 
exit/B 

batch2.bat

@echo off 
set "var=%~1" 
echo(In batch 2 var content: %var% 
exit/B 
+0

यह '%' के लिए काम करता है लेकिन यह '^' के लिए विफल रहता है क्योंकि उन्हें दोगुना कर दिया जाएगा। मान द्वारा तर्कों को 'कॉल' से बचा जाना चाहिए, कई समस्याएं हैं – jeb

2

कोई सरल नियमों कि सभी स्थितियों में लागू किया जा सकता है।

  1. ज़हर पात्रों &, |, आदि जैसे भाग निकले या उद्धृत किया जाना चाहिए:

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

  2. <space>, <tab>, =, ; और , तरह टोकन सीमांकक एक पैरामीटर मान में शामिल नहीं किया जा सकता।
  3. एक स्क्रिप्ट के लिए एक कॉल किसी भी उद्धृत % पात्रों दोगुना होगा, और इस को रोकने के लिए कोई रास्ता नहीं है। कॉल के बिना एक स्क्रिप्ट निष्पादित करने से % वर्णों को दोगुना नहीं किया जाएगा। लेकिन अगर एक स्क्रिप्ट एक और स्क्रिप्ट कहती है और नियंत्रण को वापस करने की अपेक्षा करता है, तो कॉल का उपयोग किया जाना चाहिए।

तो हमारे पास पकड़ -22 है: एक तरफ, हम जहर पात्रों और रिक्त स्थान (टोकन डिलीमीटर) के खिलाफ सुरक्षा के लिए पैरामीटर उद्धृत करना चाहते हैं। लेकिन पर्सेंट की रक्षा के लिए हम उद्धरण नहीं देना चाहते हैं।

विश्वसनीय भ्रष्टाचार की चिंता के बिना स्ट्रिंग अक्षर को विश्वसनीय रूप से पास करने का एकमात्र विश्वसनीय तरीका पर्यावरण चर के माध्यम से संदर्भ द्वारा उन्हें पास करना है।

  1. पारित होने वाला मूल्य पर्यावरण मूल्य में संग्रहीत किया जाना चाहिए। मूल्य में आवश्यक वर्ण प्राप्त करने के लिए उद्धरण और/या भाग निकलें और/या प्रतिशत दोगुनी का उपयोग किया जाता है, लेकिन यह बहुत प्रबंधनीय है।
  2. चर का नाम पैरामीटर के रूप में पारित किया गया है।
  3. स्क्रिप्ट देरी विस्तार के माध्यम से मूल्य का उपयोग करता है। उदाहरण के लिए, यदि पहला पैरामीटर मान वाले चर का नाम है, तो इसे !%1! के रूप में एक्सेस किया जाता है। उस वाक्यविन्यास का उपयोग करने से पहले विलंबित विस्तार सक्षम होना चाहिए - बस setlocal enableDelayedExpansion जारी करें।

देरी के विस्तार की सुंदरता आपको वैरिएबल का विस्तार होने पर जहर वर्णों, रिक्त स्थान या पर्सेंट के भ्रष्टाचार के बारे में चिंता करने की ज़रूरत नहीं है।

यहाँ एक उदाहरण से पता चलता है कि कैसे निम्न स्ट्रिंग शाब्दिक एक सबरूटीन के लिए पारित किया जा सकता है
"<%|,;^> This & that!" & the other thing! <%|,;^>

@echo off 
setlocal enableDelayedExpansion 
set "parm1="^<%%^|,;^^^^^> This ^& that^^!" & the other thing^! <%%|,;^^^>" 
echo The value before CALL is !parm1! 
call :test parm1 
exit /b 

:test 
echo The value after CALL is !%1! 

- आउटपुट -

The value before CALL is "<%|,;^> This & that!" & the other thing! <%|,;^> 
The value after CALL is "<%|,;^> This & that!" & the other thing! <%|,;^> 

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

आप 2 स्क्रिप्ट के कोड को दिखाने के लिए थे, और दिखाने वास्तव में क्या आप पारित करने के लिए कोशिश कर रहे थे मूल्य है, तो मैं एक समाधान है कि अलग स्थिति में काम करेगा देने में सक्षम हो सकता है। लेकिन कुछ ऐसे मूल्य हैं जिन्हें आसानी से पारित नहीं किया जा सकता है जब तक कि विलम्बित नामों के साथ देरी का विस्तार नहीं किया जाता है। (दरअसल, एक और विकल्प मूल्य को फ़ाइल में रखना और फ़ाइल से मूल्य को पढ़ना है, लेकिन इसके लिए आपकी दूसरी स्क्रिप्ट में बदलाव की आवश्यकता है)

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

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