到现场有点晚,但是无论如何这里都进行了。以下是Windows批处理脚本中堆栈数据结构的实现。
特征:
- 您必须在使用堆栈之前调用:InitializeStack子例程。
- 通过调用:Push子例程将项目压入堆栈。
- 通过调用:Pop子例程将项目弹出堆栈。
- 变量$ Count将始终包含堆栈中的项目数。
- 变量$ Top将始终包含添加到堆栈中的最新项。
- 变量$ Bottom将始终包含添加到堆栈中的第一项。
- 您可以通过调用:DumpStack子例程来转储堆栈的内容。
- 您可以压入堆栈的项目类型是可以存储在变量中的任何内容。例如,调用:Push“ String 1”,调用:Push“%1”,调用: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
-仅出于举例或出于某些原因。我对推送/弹出路径变量特别感兴趣。有什么反对备份/还原PATH
吗?