조금 늦었지만 여기에 간다. 아래는 Windows 배치 스크립팅에서 스택 데이터 구조를 구현 한 것입니다.
풍모:
- 스택을 사용하기 전에 : InitializeStack 서브 루틴을 호출해야합니다 .
- : Push 서브 루틴 을 호출하여 스택의 항목을 푸시하십시오 .
- : Pop 서브 루틴 을 호출하여 스택에서 항목을 팝하십시오 .
- 변수 $ Count 는 항상 스택의 항목 수를 포함합니다.
- 변수 $ Top 에는 항상 스택에 추가 된 가장 최근 항목이 포함됩니다.
- 변수 $ Bottom 은 항상 스택에 추가 된 첫 번째 항목을 포함합니다.
- : DumpStack 서브 루틴 을 호출하여 스택의 컨텐츠를 덤프 할 수 있습니다 .
- 스택에 푸시 할 수있는 항목 유형은 변수에 저장할 수있는 것입니다. 예를 들어 Call : Push "String 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
예를 들어 또는 어떤 이유로 든 제외 합니다. 특히 경로 변수 푸시 / 팝에 관심이 있습니다. 백업 / 복원에 대해 말하는 것이PATH
있습니까?