Um pouco tarde para a cena, mas aqui vai de qualquer maneira. Abaixo está uma implementação de uma estrutura de dados de pilha nos scripts em lotes do Windows.
Recursos:
- Você deve chamar a sub-rotina : InitializeStack antes de usar a pilha.
- Empurre itens na pilha chamando a : Sub- rotina Push .
- Retire os itens da pilha chamando a sub-rotina : Pop .
- A variável $ Count sempre conterá a contagem de itens na pilha.
- A variável $ Top sempre conterá o item mais recente adicionado à pilha.
- A variável $ Bottom sempre conterá o primeiro item adicionado à pilha.
- Você pode despejar o conteúdo da pilha chamando a sub-rotina : DumpStack .
- O tipo de itens que você pode enviar na pilha é qualquer coisa que possa ser armazenada em uma variável. Por exemplo, Chamada: Push "String 1" , Chamada: Push "% 1" , Chamada: Push "% MyVariable%" , etc.
Eu uso a pilha nos meus arquivos em lotes para acompanhar as chamadas de sub-rotina. Cada sub-rotina nos meus arquivos em lote começa com Chamada: pressione% 0 , que coloca o nome da sub-rotina atual na pilha e termina com Chamada: Pop .
Alguns podem achar que é um over-kill para execução de scripts em lote, mas eu apreciei o criar e espero que alguém vai encontrar este útil, desfrutar .
@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
Portanto, para enviar todas as variáveis de ambiente por push, você pode chamar: PushAllEnvironmentVariables, para restaurar todas as variáveis de ambiente, você pode chamar: PopAllEnvironmentVariables
PATH
- apenas por exemplo ou por algum motivo. Estou especialmente interessado em empurrar / pop a variável path. Existe algo que fale contra backup / restauraçãoPATH
?