Agak terlambat ke tempat kejadian tapi begini saja. Di bawah ini adalah implementasi dari struktur data stack dalam skrip batch Windows.
Fitur:
- Anda harus memanggil : Inisialisasi subrutin sebelum menggunakan stack.
- Dorong item pada tumpukan dengan memanggil : Dorong subrutin.
- Pop item dari tumpukan dengan memanggil : Pop subroutine.
- Variabel $ Count akan selalu berisi jumlah item dalam tumpukan.
- Variabel $ Top akan selalu berisi item terbaru yang ditambahkan ke stack.
- Variabel $ Bawah akan selalu berisi item pertama yang ditambahkan ke stack.
- Anda dapat membuang konten tumpukan dengan memanggil : DumpStack subroutine.
- Jenis item yang bisa Anda dorong di tumpukan adalah apa saja yang dapat disimpan dalam variabel. Misalnya, Panggil: Tekan "String 1" , Panggil: Tekan "% 1" , Panggil: Tekan "% MyVariable%" , dll.
Saya menggunakan tumpukan di file batch saya untuk melacak panggilan subrutin. Setiap subrutin dalam file kumpulan saya dimulai dengan Panggilan: Tekan% 0 , yang mendorong nama subrutin saat ini ke tumpukan dan diakhiri dengan Panggilan: Pop .
Beberapa orang mungkin menganggapnya sebagai over-kill untuk skrip batch tetapi saya senang membuatnya dan saya berharap seseorang akan menemukan ini berguna, selamat menikmati .
@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
Jadi, untuk mendorong semua variabel lingkungan yang dapat Anda panggil: PushAllEnvironmentVariables, untuk mengembalikan semua variabel lingkungan, Anda dapat memanggil: PopAllEnvironmentVariables
PATH
- hanya untuk contoh atau karena alasan tertentu. Saya terutama tertarik pada variabel push / pop path. Apakah ada yang mendukung backup / restorePATH
?