क्या एक बैच स्क्रिप्ट में सभी पर्यावरण चर को धक्का देने और पॉप करने का एक तरीका है?


10

क्या एक बैच स्क्रिप्ट में सभी पर्यावरण चर को धक्का देने और पॉप करने का एक तरीका है? उदाहरण के लिए मैं कुछ ऐसा करना चाहूंगा:

pushEnvironmentVariables
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
popEnvironmentVariables
pushEnvironmentVariables
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
popEnvironmentVariables

जवाबों:


13

सेट्लोकल का उपयोग करें, देखें setlocal /?या ss64.com/nt/setlocal

Setlocal
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
Endlocal
Setlocal
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
Endlocal

वर्तमान चर स्थिति को बचाने के लिए आप कर सकते हैं

set >MyVarStatus.txt

और बाद में साथ बहाल करें

@Echo off
For /f "tokens=1* delims==" %%A in (
  'findstr /V "^Path" MYVarStatus.txt '
) Do Set %%A=%%B

यह पथ चर को बाहर कर देगा।


आप बाहर करते हैं PATH- केवल उदाहरण के लिए या किसी कारण से। मैं विशेष रूप से पथ चर को पुश / पॉप करने में रुचि रखता हूं। क्या ऐसा कुछ है जो बैकअप / पुनर्स्थापना के खिलाफ बोलता है PATH?
वुल्फ

वास्तव में, एक उदाहरण और मामले में महत्वपूर्ण परिवर्तन इस बीच रास्ते में एक एहतियात के लिए लागू किए गए थे। @ वुल्फ
लॉटिंग्स

ठीक है, आप सभी मामलों में निश्चित नहीं हो सकते हैं, लेकिन यदि आपको किसी विशिष्ट सत्र के लिए पथ में कुछ जोड़ना है, तो आप निश्चित रूप से बाद में पथ को बहाल करने में रुचि रखते हैं। यदि बाहरी उपकरण नहीं थे जो अन्य उपकरणों को कॉल करते हैं और उन्हें रास्ते में होने की उम्मीद करते हैं तो आपको ऐसा नहीं करना होगा।
वुल्फ

1
कोड परिवर्तन के लिए खुला है, यदि कोई संपूर्ण वातावरण को पुनर्स्थापित करना चाहता है तो बस टाइप के साथ मिलस्ट्रैप को प्रतिस्थापित करें।
लोटपिंग्स

धन्यवाद, मैं सिर्फ यह सुनिश्चित करना चाहता था कि कुछ भी महत्वपूर्ण नहीं है।
वुल्फ

1

घटनास्थल के लिए थोड़ा देर से लेकिन यहाँ वैसे भी जाता है। नीचे Windows बैच स्क्रिप्टिंग में स्टैक डेटा संरचना का कार्यान्वयन है।

विशेषताएं:

  • आपको कॉल करना होगा : स्टैक का उपयोग करने से पहले InitializeStack सबरूटीन।
  • स्टैक पर आइटम पुश करें : पुश सबरूटीन।
  • पॉप आइटम को स्टैक से कॉल करें : पॉप सबरूटीन।
  • वैरिएबल $ काउंट में हमेशा स्टैक में वस्तुओं की गिनती शामिल होगी।
  • चर $ शीर्ष में हमेशा स्टैक में जोड़ा गया सबसे हाल का आइटम होगा।
  • चर $ नीचे हमेशा स्टैक में जोड़ा गया पहला आइटम होगा।
  • आप डंपस्टैक सबरूटीन : को कॉल करके स्टैक की सामग्री को डंप कर सकते हैं ।
  • स्टैक पर आप जिस प्रकार की वस्तुओं को धक्का दे सकते हैं वह कुछ भी है जिसे एक चर में संग्रहीत किया जा सकता है। उदाहरण के लिए, कॉल: पुश "स्ट्रिंग 1" , कॉल: पुश "% 1" , कॉल: पुश "% MyVariable" , आदि।

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

कुछ को बैच स्क्रिप्टिंग के लिए यह ओवर-किल मिल सकता है लेकिन मुझे इसे बनाने में मज़ा आया और मुझे उम्मीद है कि किसी को यह उपयोगी लगेगा, आनंद मिलेगा ।

@Echo Off
Cls
SetLocal
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Call :InitializeStack

Call :Push "String 1"
Call :Push "String 2"
Call :Push "String 3"
Call :Pop

Echo Total items in stack = !$Count!
Echo Top of stack         = !$Top!
Echo Bottom of stack      = !$Bottom!
Call :DumpStack

Goto End

:InitializeStack
:------------------------------------------------------------
Set "$Stack[0]=0"
Set "$Count=!$Stack[0]!"
Set "$Top="
Set "$Bottom="
Exit /b

:DumpStack
:------------------------------------------------------------
If !$Stack[0]! EQU 0 (
  Echo Stack is empty.
) Else (
  Echo.
  Echo Stack Dump
  Echo ----------
  For /l %%a In (!$Stack[0]!,-1,1) Do (Echo !$Stack[%%a]!)
)
Exit /b

:Push <String>
:------------------------------------------------------------
Set /a "$Stack[0]+=1"
Set "$Count=!$Stack[0]!"
Set "$Top=%~1"
Set "$Bottom=!$Stack[1]!"
Set "$Stack[!$Stack[0]!]=!$Top!"
Exit /b

:Pop
:------------------------------------------------------------
If !$Stack[0]! EQU 0 (
  Echo "Stack is empty."
) Else (
  Set "$Stack[!$Stack[0]!]="
  Set /a "$Stack[0]-=1"
  Set "$Count=!$Stack[0]!"
  If !$Stack[0]! GTR 0 (
    For %%a In (!$Stack[0]!) Do Set "$Top=!$Stack[%%a]!"
    Set "$Bottom=!$Stack[1]!"
  ) Else (
    Set "$Top="
    Set "$Bottom="
  )
)Exit /b

:PushAllEnvironmentVariables
:------------------------------------------------------------
For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a"
Exit /b

:PopAllEnvironmentVariables
:------------------------------------------------------------
For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!)
Exit /b

:End

इसलिए, सभी पर्यावरण चर को पुश करने के लिए जिन्हें आप कॉल कर सकते हैं: PushAllEnvironmentVariables, सभी पर्यावरण चर को पुनर्स्थापित करने के लिए, आप कॉल कर सकते हैं: PopAllEnvironmentVariables


यह एक नज़र है - कुछ ऐसा है जो शायद विकसित करने के लिए कुछ प्रयास करता है, और शायद किसी के लिए उपयोगी हो सकता है। तुम ऐसा कैसे व्याख्या कर सकते हैं एक प्रदान करता है इस सवाल का जवाब करने के लिए इस सवाल का ?
स्कॉट

मैं आपकी बात को देखता हूं, आपके द्वारा उपयोग किए जाने वाले सभी पर्यावरण चर को धक्का देने के लिए: आपके द्वारा उपयोग किए जा सकने वाले सभी पर्यावरण चर For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" को पुनर्स्थापित करने के लिए: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) मैंने 2 उप-युक्तियों को शामिल करने के उत्तर को अपडेट किया है जो इसे लागू करता है।
सफवान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.