2009-11-07 9 views
6

मुझे नहीं पता कि मैं वास्तव में क्या करने की कोशिश कर रहा हूं, लेकिन यहां एक उदाहरण बैच फ़ाइल है जो दर्शाती है कि मैं क्या नहीं समझ सकता:मैं एक बैच फ़ाइल में रिक्त स्थान वाले मान के लिए एक पर्यावरण चर सेट कैसे करूं?

मुझे बैच फ़ाइल मिली है।

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

मेरे बैच फ़ाइल के साथ लाइन 4 Set TargetDir =... पर विफल हो रहा है: कि बैच फ़ाइल के अंदर मैं एक निर्देशिका बनाने के लिए कोशिश कर रहा हूँ

\My was unexpected at this time 

मैं इस संभालने रहा हूँ क्योंकि मैं में रिक्त स्थान है मेरी पथ का नाम मैंने सोचा कि मैं सिर्फ उद्धरण के साथ अपने चर लपेट सकता है:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

लेकिन तब जब मैं लाइन है कि निर्देशिका यह विफल रहता है क्योंकि %TargetDir% अब उद्धरण में लपेटा जाता है बनाता है के लिए मिलता है। md "%TargetDir%"\NewSubFolder

क्या यह तय किया जा सकता है या क्या मुझे चीज़ों को हल करने के लिए बस एक वीबीस्क्रिप्ट लिखना चाहिए?

उत्तर

6

बस इस तरह उद्धरण में अपने अभिव्यक्ति डाल:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

ध्यान दें: यह उद्धरण के भीतर चर का विस्तार होगा, और अगर यह बहुत रिक्त स्थान है, यह कहते हुए उद्धृत करने की आवश्यकता होगी।

अब आप अपने कार्रवाई करने के लिए यह बोली कर सकते हैं:

md "%TargetDir%\NewSubFolder" 
+0

धन्यवाद, यह केवल टिकट था, बहुत सराहना की। – BobTheBuilder

+0

यह मेरे लिए कभी नहीं हुआ कि मैं कोट्स में सेट के बाद पूरे आइटम को लपेट सकता हूं ... बेशक, यह बिल्कुल सहज नहीं है? – BobTheBuilder

+0

नहीं, अंतर्ज्ञानी नहीं। (विंडोज कमांड लाइन के बारे में ज्यादा नहीं है - यही कारण है कि मैंने पावरहेल पर स्विच किया)। मैं इसके बारे में सोचता हूं: "=" के दोनों पक्ष सेट कमांड के लिए एक ही तर्क हैं। – zdan

2

के रूप में दूसरों का सुझाव दिया प्रश्न में समस्या यहाँ नहीं रिक्त स्थान है, बल्कि वातावरण चर ProgramFiles(x86) में समापन कोष्ठक यह पार्सर का कारण बनता है यह सोचने के लिए कि ब्लॉक समय-समय पर समाप्त होता है (shameless self-promotion)।

उद्धरण इस मामले में सहायता करें क्योंकि वे पूरे उद्धृत भाग पर पार्सर कूदते हैं और सही ढंग से निम्नलिखित समापन को वास्तविक समापन मानते हैं। लेकिन ठीक से कहीं आसान हो सकता है:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

क्यों सब पर एक parenthesized ब्लॉक का उपयोग करता है, तो तुम सब यह इसे में ठीक एक आदेश डाल?

set ही को छोड़कर किसी भी उद्धरण की जरूरत नहीं है, जब अपने तर्कों <, >, |, & जो खोल ही aready संभालती की तरह विशेष वर्ण। यह एक पैनसिया नहीं है, हालांकि उपयोगकर्ता इनपुट या फ़ाइल सामग्री को कई बार सही ढंग से दर्द से निपटने में मदद करता है।

इसके अलावा, कृपया कभी भी के आसपास set कमांड में रिक्त स्थान न रखें। यह एक पर्यावरण चर को नाम के साथ एक अंतरिक्ष में समाप्त होने और अंतरिक्ष से शुरू होने वाली सामग्री के साथ बनाया जाएगा।

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

लेकिन Windows के इस पिछले संस्करणों में ऐसा नहीं हुआ तो बस = जब तक चारों ओर रिक्त स्थान का उपयोग कभी नहीं: यह आंशिक रूप से चुपचाप बिना दोनों अंत में अंतरिक्ष के साथ चर और बनाकर विंडोज 7 में सही था आप जानते हैं कि यह वही है जो आप चाहते हैं :-)

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

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