2012-05-11 6 views
37

में देरी से विस्तार का उदाहरण क्या कोई मुझे उदाहरण दे सकता है कि बैच स्क्रिप्ट अलग-अलग विस्तार के बिना या बिना किसी कार्य के कहां कार्य करेगी? क्या ऐसी कोई परिस्थितियां हैं जहां आप देरी से विस्तार का उपयोग नहीं करना चाहेंगे? धन्यवाद। निम्न उदाहरणों परबैच फ़ाइल

उत्तर

43

देखो ...

उदाहरण 1: निम्नलिखित कोड देरी विस्तार का उपयोग नहीं करता है, तो पाश के लिए में चर केवल एक बार विस्तार किया गया है। इसका मतलब है कि %Count% हमेशा कोई बात नहीं क्या हम सेट आदेश के साथ करने के लिए क्या पाश, में से प्रत्येक चरण में 0 करने का विस्तार होगा:

@echo off 
set COUNT=0 

for %%v in (1 2 3 4) do (
    set /A COUNT=%COUNT% + 1 
    echo Count = %COUNT% 
) 
pause 

तो इस स्क्रिप्ट उत्पादन होगा:

Count = 0 
Count = 0 
Count = 0 
Count = 0 

यह वह जगह है इस लूप को कैसे काम करना चाहिए।

उदाहरण 2: दूसरी ओर, यदि हम देरी से विस्तार का उपयोग करते हैं, तो हमारे पास निम्न स्क्रिप्ट है, जो अपेक्षित के रूप में चलती है।

setlocal ENABLEDELAYEDEXPANSION 
set COUNT=0 

for %%v in (1 2 3 4) do (
    set /A COUNT=!COUNT! + 1 
    echo Count = !COUNT! 
) 

pause 

और, के रूप में उम्मीद, यह उत्पादन:

Count = 1 
Count = 2 
Count = 3 
Count = 4 

आप ENABLEDELAYEDEXPANSION उपयोग करें, और % के बजाय ! का उपयोग कर एक चर का विस्तार करते हैं, चर हर बार फिर से विस्तार किया जाता है, और सब कुछ जैसा कि यह माना जाता है के रूप में काम करता है।

+0

अच्छा उदाहरण। लेकिन फिर भी बेहतर 'सेट किया जाएगा का उपयोग कर/गिनती = COUNT + 1' या कम' सेट/ए COUNT + = 1' प्रदर्शित करने के लिए है कि एक __arithmetic expression__ चर सिर्फ अपने नाम के साथ संदर्भित किया जा सकता हैं। एक __arithmetic अभिव्यक्ति__ 'सेट/ए' के बाद स्ट्रिंग है। कमांड प्रॉम्प्ट विंडो 'सेट /?' में चलने में सहायता आउटपुट एक __IF__ और __FOR__ उदाहरण में विलंब विस्तार और अंकगणितीय अभिव्यक्तियों में विशेष चर पार्सिंग बताता है। – Mofi

7

मैं कैसे "EnableDelayedExpansion" (EDE) पाश उदाहरण के लिए सर्वव्यापी के बाहर उपयोगी हो सकता है पर एक महान उदाहरण जोड़ना चाहते थे।

यहाँ

ak_11574812 2015.04.29.193822 62.9525 -148.8849 1.0 9.5 कांटवेल का 1 49km एस, अलास्का

भूकंप डेटा की एक पंक्ति है कि मैं पार्स करने के लिए इच्छा (मैं इसे यह 1line.txt कहते हैं) है

जिस समस्या में मैंने भाग लिया था वह था कि इस पंक्ति का अंतिम खंड हमेशा एक ही कॉलम नंबर पर शुरू नहीं होता है। इसलिए मुझे एक लचीला एसईटी कमांड बनाने की ज़रूरत है जो इस लाइन के अंतिम खंड को सटीक रूप से निकाल देगा।

ECHO OFF 
setlocal enableDelayedExpansion 
set where=72 
set /p line=<1line.txt 
set locate=!line:~%where%,28! 
echo %locate% 

EDE मुझे एक चर (जहां) एक और चर (लाइन) के अंदर रख सकते हैं। ईडीई पहले% द्वारा ब्रैकेट किए गए चर का अनुवाद करेगा, फिर वैरिएबल को ब्रैकेट की प्रक्रिया करेगा! और (इस मामले में) परिणामों को "पता लगाने" चर में डाल दें।

+0

हालांकि सीधे प्रश्न से संबंधित नहीं है, यह एकमात्र ऐसा स्थान था जहां मैं यह पता लगाने में सक्षम हूं कि वेरिएबल्स में गुजरकर सब स्ट्रिंग को कैसे हटाया जा सकता है, और क्या सही क्रम और% का था, इसलिए धन्यवाद:) –

7

Max's answerएक उदाहरण देता है जहां एक बैच स्क्रिप्ट अलग-अलग विस्तार के बिना या बिना देरी के विस्तार पर कार्य करेगी।

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

ऊपर स्क्रिप्ट %% यह दोगुना (देरी expansi द्वारा proper ways of escaping

  • % प्रतिशत चिह्न से पता चलता
    @ECHO OFF 
    SETLOCAL EnableExtensions DisableDelayedExpansion 
    
        set "_auxFile=%temp%\%~n0.txt" 
        rem create multiline sample file 
        >"%_auxFile%" (for /L %%G in (1,1,3) do echo line %%G is 100%% valid! Sure! Hurrah!) 
        rem create one-line sample file 
        >"%_auxFile%" echo this line is 100%% valid! Sure! Hurrah! 
    
        echo(
        echo --- file content 
        type "%_auxFile%" 
    
        echo(
        SETLOCAL EnableDelayedExpansion 
        echo --- enabled delayed expansion chokes down unescaped exclamation marks^^^! "^!" 
        for /F "usebackq delims=" %%G in ("%_auxFile%") do (
         set "_auxLine=%%~G" 
         echo loop var=%%~G 
         echo _auxLine=!_auxLine! 
        ) 
        ENDLOCAL 
        echo(
        SETLOCAL DisableDelayedExpansion 
        echo --- toggled delayed expansion works although might be laborious! 
        for /F "usebackq delims=" %%G in ("%_auxFile%") do (
         set "_auxLine=%%G" 
         echo loop var=%%G 
         SETLOCAL EnableDelayedExpansion 
         echo _auxLine=!_auxLine! 
         ENDLOCAL 
        ) 
        ENDLOCAL 
        echo(
        SETLOCAL DisableDelayedExpansion 
        echo --- keep delayed expansion DISABLED: use CALL command! 
        for /F "usebackq delims=" %%G in ("%_auxFile%") do (
         set "_auxLine=%%G" 
         echo loop var=%%G 
         call :ProcessVar 
        ) 
        ENDLOCAL 
    
        rem delete the sample file 
        del "%_auxFile%" 
    ENDLOCAL 
    goto :eof 
    
    :ProcessVar 
        echo _auxLine=%_auxLine% 
        echo WARNING: neither !_auxLine! nor %%G loop variable is available here! 
    goto :eof 
    

    ध्यान दें कि पर कोई प्रभाव नहीं पड़ेगा), और

  • ! विस्मयादिबोधक चिह्न अगर देरी विस्तार सक्षम है:
    • "^!" अगर दोहरे उद्धरण चिह्नों की एक जोड़ी में संलग्न है, तो cmd और बैच स्क्रिप्ट सामान्य एस्केप वर्ण ^ कैरट का उपयोग करें;
    • ^^^! अन्यथा, तीन ^ देखभाल का उपयोग करें।

आउटपुट:

==> D:\bat\SO\10558316.bat 

--- file content 
this line is 100% valid! Sure! Hurrah! 

--- enabled delayed expansion chokes down unescaped exclamation marks! "!" 
loop var=this line is 100% valid Hurrah 
_auxLine=this line is 100% valid Hurrah 

--- toggled delayed expansion works although might be laborious! 
loop var=this line is 100% valid! Sure! Hurrah! 
_auxLine=this line is 100% valid! Sure! Hurrah! 

--- keep delayed expansion DISABLED: use CALL command! 
loop var=this line is 100% valid! Sure! Hurrah! 
_auxLine=this line is 100% valid! Sure! Hurrah! 
WARNING: !_auxLine! as well as %G loop variables are not available here! 

==> 
+0

केवल उस मध्य भाग और लिंक के लिए +1; जब से मैं गर्भ से उभरा था तब से मैं उस जानकारी की तलाश कर रहा हूं। – Andrew