ব্যাচের স্ক্রিপ্টে সমস্ত পরিবেশের ভেরিয়েবলগুলি ধাক্কা দেওয়ার এবং পপ করার কোনও উপায় আছে কি?


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

দৃশ্যে কিছুটা দেরি হলেও এখানে যাই হোক। নীচে উইন্ডোজ ব্যাচ স্ক্রিপ্টিংয়ে স্ট্যাক ডেটা স্ট্রাকচারের একটি বাস্তবায়ন রয়েছে।

বৈশিষ্ট্য:

  • স্ট্যাকটি ব্যবহার করার আগে আপনাকে অবশ্যই : ইনিশিয়ালস্ট্যাক স্ট্রোক সাবট্রিনটি কল করতে হবে ।
  • স্ট্যাকের উপর আইটেমগুলি পুশ করুন : সাববুটিন পুশ করুন
  • স্টপ থেকে পপ আইটেমগুলি কল করুন : পপ সাববুটিন।
  • পরিবর্তনশীল $ গণনা সর্বদা স্ট্যাকের আইটেমগুলির গণনা ধারণ করে।
  • পরিবর্তনশীল $ শীর্ষে সর্বদা স্ট্যাকটিতে যুক্ত হওয়া সাম্প্রতিকতম আইটেম থাকবে।
  • পরিবর্তনশীল $ নীচে সর্বদা স্ট্যাকের সাথে যুক্ত প্রথম আইটেমটি থাকবে।
  • আপনি স্ট্যামের সামগ্রীটি: ডাম্পস্ট্যাক সাবরুটিন কল করে ডাম্প করতে পারেন ।
  • স্ট্যাকের ধরণের ধরণের আইটেমগুলি এমন কোনও যা ভেরিয়েবলের মধ্যে সংরক্ষণ করা যায়। উদাহরণস্বরূপ, কল করুন: "স্ট্রিং 1" পুশ করুন , কল করুন: "% 1" চাপুন , কল করুন: "% মাইভেরিবেল%" , ইত্যাদি পুশ করুন etc.

সাবউটাইন কলগুলি ট্র্যাক রাখতে আমি আমার ব্যাচ ফাইলগুলিতে স্ট্যাকটি ব্যবহার করি। আমার ব্যাচের ফাইলগুলির প্রতিটি সাব্রোটিন কল: পুশ% 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

সুতরাং, সমস্ত পরিবেশের ভেরিয়েবলগুলিকে ধাক্কা দেওয়ার জন্য আপনি কল করতে পারেন: পুশআলইনমায়ার্নেশিয়াল ভেরিয়েবলগুলি, সমস্ত পরিবেশের ভেরিয়েবল পুনরুদ্ধার করতে, আপনি কল করতে পারেন: পপএলএলনোভারমেন্টভেরিয়েবল


এটিকে এক নজরে দেখে মনে হচ্ছে এমন কিছু হতে পারে যা সম্ভবত বিকাশের জন্য কিছু প্রচেষ্টা নিয়েছিল এবং কারও পক্ষে উপকারী হতে পারে। আপনি কিভাবে এই ব্যাখ্যা করতে পারবেন একটি উপলব্ধ উত্তর থেকে এই প্রশ্নের ?
স্কট

আমি আপনার পয়েন্টটি দেখতে পাচ্ছি, আপনি ব্যবহার করতে পারেন এমন সমস্ত পরিবেশের ভেরিয়েবলগুলি ধাক্কা দেওয়ার জন্য: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" আপনি ব্যবহার করতে পারেন এমন সমস্ত পরিবেশের ভেরিয়েবলগুলি পুনরুদ্ধার করতে: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) আমি উত্তরটি আপডেট করেছি যাতে এটি প্রয়োগ করে এমন দুটি সাব্রোটাইন অন্তর্ভুক্ত করে।
সাফওয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.