2009-01-10 9 views
7

विंडोज पर कुछ बैच फ़ाइलों को कई पंक्तियों, जैसा कि नीचे के साथ एक अगर सिंटैक्स का उपयोग करें:बैच फ़ाइलें, विस्टा x64, अगर और कोष्ठक

if var==rule (
    some comands 
) else (
    else commands 
) 

अब, विंडोज विस्टा x64 "सी के तहत सभी 32 बिट फ़ाइलों का निर्णय लिया : \ प्रोग्राम फ़ाइलें (x86) "। दुर्भाग्यवश, जब भी आप बिना किसी उद्धरण के एक बहु रेखा के अंदर एक पर्यावरण चर (जैसे पीएटीएच) का उपयोग करते हैं, तो वैरिएबल के मूल्य के अंदर कोष्ठक आईएफ को भ्रमित करता है, बैच फ़ाइल को निरस्त करता है। उदाहरण के लिए:

if "%OS%"=="Windows_NT" (
    @setlocal 
    call :set_home 
    set _ARGS=%* 
) else (
    set _SCALA_HOME=%SCALA_HOME% 
    rem The following line tests SCALA_HOME instead of _SCALA_HOME, because 
    rem the above change to _SCALA_HOME is not visible within this block. 
    if "%SCALA_HOME%"=="" goto error1 
    call :set_args 
) 

इस के साथ एक बैच फ़ाइल असफल हो जायेगी भी लाइन जहां% SCALA_HOME% प्रकट होता है निष्पादित हो नहीं करता, हालांकि। यह बल्कि कष्टप्रद है। क्या इसका कोई समाधान है?

उत्तर

9
!SCALA_HOME! करने के लिए

बदलें %SCALA_HOME% की सभी आवृत्तियों, और फ़ाइल के शीर्ष के निकट निम्नलिखित जोड़ें:

setlocal enableextensions enabledelayedexpansion 

"चर विस्तार में देरी", जिसका अर्थ है कि प्रपत्र !VAR! में लिखा चर हैं पर बाद बदल जाता है जब तक कथन स्वयं को पार्स नहीं किया जाता है, तब तक इसका विस्तार नहीं किया जाता है। (मेरे सीमित अनुभव में, और निश्चित रूप से इस मामले में, इसका मतलब है कि परिवर्तनीय विस्तार की वास्तविक बैच फ़ाइल सिंटैक्स संरचनाओं के रूप में गलत व्याख्या की जा सकती है।) पैट्रिक कफ को धन्यवाद, यह टिप्पणी में इसे करने का बेहतर तरीका बताते हुए।

पीएस .: जैसा कि आप खोज रहे हैं, cmd.exe बैच फ़ाइल भाषा बहुत ही कई तरीकों से टूट गई है। यदि आप वास्तविक स्क्रिप्टिंग भाषा का उपयोग नहीं कर सकते हैं (उदाहरण के लिए यदि आपके कार्य को अन्य कंप्यूटरों पर निष्पादित करने की आवश्यकता है), तो मैं गंभीर सी/सी ++ "स्क्रिप्ट" को खारिज करने की गंभीरता से अनुशंसा करता हूं जो नौकरी करता है, और इसे .EXE पर संकलित करता है।

+1

यदि विस्तारित विस्तार वास्तव में इस समस्या को हल करता है, तो आपको दूसरी बैच स्क्रिप्ट की आवश्यकता नहीं होगी, बस अपनी स्क्रिप्ट के शीर्ष पर 'setlocal enableextensions enableelayedexpansion' डालें। –

+0

मुझे नहीं पता था, धन्यवाद पैट्रिक! बहुत अच्छे। –

+0

मैं setlocal enableextensions enableelayedexpasion का उपयोग करने का प्रयास करूंगा। अगर यह काम करता है, तो मुझे स्वीकार किए जाने के लिए सेट करने के लिए एक और जवाब की आवश्यकता होगी। –

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