Трохи запізнюючись на сцену, але тут все одно йде. Нижче представлена реалізація структури даних стека в пакетному сценарії Windows.
Особливості:
- Ви повинні викликати підпрограму : InitializeStack перед використанням стека.
- Натисніть на елементи стека, зателефонувавши : Підпрограма Push .
- Вискочіть елементи зі стека, зателефонувавши у програму : Pop .
- Змінна $ Count завжди буде містити кількість елементів у стеку.
- Змінна $ Top завжди буде містити останній елемент, доданий до стеку.
- Змінна $ Bottom завжди буде містити перший елемент, доданий до стеку.
- Ви можете скинути вміст стеку, зателефонувавши в підпрограму : DumpStack .
- Тип елементів, які можна натиснути на стек, - це все, що можна зберігати в змінній. Наприклад, зателефонувати: натиснути "Рядок 1" , зателефонувати: натиснути "% 1" , зателефонувати: натиснути "% MyVariable%" тощо.
Я використовую стек у своїх пакетних файлах для відстеження викликів підпрограми. Кожна підпрограма в моїх пакетних файлах починається з Call: Push% 0 , яка висуває ім'я поточної підпрограми на стек і закінчується Call: Pop .
Деякі можуть вважати це надмірним вбивством для пакетного сценарію, але мені сподобалося його створювати, і я сподіваюся, що хтось знайде це корисним, сподобається .
@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
PATH
- лише, наприклад, або чомусь. Мене особливо цікавить зміна "push / pop". Чи є щось, що говорить проти резервного копіювання / відновленняPATH
?