में देरी से विस्तार का उदाहरण क्या कोई मुझे उदाहरण दे सकता है कि बैच स्क्रिप्ट अलग-अलग विस्तार के बिना या बिना किसी कार्य के कहां कार्य करेगी? क्या ऐसी कोई परिस्थितियां हैं जहां आप देरी से विस्तार का उपयोग नहीं करना चाहेंगे? धन्यवाद। निम्न उदाहरणों परबैच फ़ाइल
उत्तर
देखो ...
उदाहरण 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
उपयोग करें, और %
के बजाय !
का उपयोग कर एक चर का विस्तार करते हैं, चर हर बार फिर से विस्तार किया जाता है, और सब कुछ जैसा कि यह माना जाता है के रूप में काम करता है।
मैं कैसे "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 मुझे एक चर (जहां) एक और चर (लाइन) के अंदर रख सकते हैं। ईडीई पहले% द्वारा ब्रैकेट किए गए चर का अनुवाद करेगा, फिर वैरिएबल को ब्रैकेट की प्रक्रिया करेगा! और (इस मामले में) परिणामों को "पता लगाने" चर में डाल दें।
हालांकि सीधे प्रश्न से संबंधित नहीं है, यह एकमात्र ऐसा स्थान था जहां मैं यह पता लगाने में सक्षम हूं कि वेरिएबल्स में गुजरकर सब स्ट्रिंग को कैसे हटाया जा सकता है, और क्या सही क्रम और% का था, इसलिए धन्यवाद:) –
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!
==>
केवल उस मध्य भाग और लिंक के लिए +1; जब से मैं गर्भ से उभरा था तब से मैं उस जानकारी की तलाश कर रहा हूं। – Andrew
अच्छा उदाहरण। लेकिन फिर भी बेहतर 'सेट किया जाएगा का उपयोग कर/गिनती = COUNT + 1' या कम' सेट/ए COUNT + = 1' प्रदर्शित करने के लिए है कि एक __arithmetic expression__ चर सिर्फ अपने नाम के साथ संदर्भित किया जा सकता हैं। एक __arithmetic अभिव्यक्ति__ 'सेट/ए' के बाद स्ट्रिंग है। कमांड प्रॉम्प्ट विंडो 'सेट /?' में चलने में सहायता आउटपुट एक __IF__ और __FOR__ उदाहरण में विलंब विस्तार और अंकगणितीय अभिव्यक्तियों में विशेष चर पार्सिंग बताता है। – Mofi