Một chút muộn để đến hiện trường nhưng ở đây đi dù sao đi nữa. Dưới đây là một triển khai cấu trúc dữ liệu ngăn xếp trong tập lệnh bó Windows.
Đặc trưng:
- Bạn phải gọi chương trình con : InitializeStack trước khi sử dụng ngăn xếp.
- Đẩy các mục trên ngăn xếp bằng cách gọi chương trình con : Đẩy chương trình con.
- Các mục pop khỏi ngăn xếp bằng cách gọi chương trình con Pop .
- Biến $ Count sẽ luôn chứa số lượng vật phẩm trong ngăn xếp.
- Biến $ Top sẽ luôn chứa mục gần đây nhất được thêm vào ngăn xếp.
- Biến $ bottom sẽ luôn chứa mục đầu tiên được thêm vào ngăn xếp.
- Bạn có thể kết xuất nội dung của ngăn xếp bằng cách gọi chương trình con : DumpStack .
- Loại vật phẩm mà bạn có thể đẩy vào ngăn xếp là bất cứ thứ gì có thể được lưu trữ trong một biến. Ví dụ : Gọi: Đẩy "Chuỗi 1" , Gọi: Đẩy "% 1" , Gọi: Đẩy "% MyVariable%" , v.v.
Tôi sử dụng ngăn xếp trong các tệp bó của mình để theo dõi các cuộc gọi chương trình con. Mỗi chương trình con trong các tệp bó của tôi bắt đầu bằng Call: Push% 0 , sẽ đẩy tên của chương trình con hiện tại lên ngăn xếp và kết thúc bằng Call: Pop .
Một số người có thể thấy nó là một sự tiêu diệt quá mức đối với kịch bản hàng loạt nhưng tôi rất thích tạo ra nó và tôi hy vọng ai đó sẽ thấy điều này hữu ích, hãy tận hưởng .
@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
Vì vậy, để đẩy tất cả các biến môi trường, bạn có thể gọi: Push ALLEn MôiVariables, để khôi phục tất cả các biến môi trường, bạn có thể gọi: Pop ALLEn MôiVariables
PATH
- chỉ cho ví dụ hoặc vì một số lý do. Tôi đặc biệt quan tâm đến việc đẩy / bật biến đường dẫn. Có bất cứ điều gì nói chống lại sao lưu / khôi phụcPATH
?