Немного опоздал на сцену, но все равно идет. Ниже приведена реализация структуры данных стека в пакетных сценариях Windows.
Особенности:
- Вы должны вызвать подпрограмму : InitializeStack перед использованием стека.
- Поместите элементы в стек, вызвав функцию: Push .
- Удаление элементов из стека путем вызова функции : Pop .
- Переменная $ Count всегда будет содержать количество элементов в стеке.
- Переменная $ Top всегда будет содержать самый последний элемент, добавленный в стек.
- Переменная $ Bottom всегда будет содержать первый элемент, добавленный в стек.
- Вы можете выгрузить содержимое стека, вызвав подпрограмму : DumpStack .
- Типы элементов, которые вы можете поместить в стек, - это все, что можно сохранить в переменной. Например, Call: Push «Строка 1» , Call: Push «% 1» , Call: Push «% 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
?