ช้าไปหน่อย แต่ก็ยังไปไม่ถึง ด้านล่างคือการนำโครงสร้างข้อมูลสแต็กมาใช้ในการสร้างสคริปต์ชุดงาน Windows
คุณสมบัติ:
- คุณต้องเรียกใช้รูทีนย่อย: InitializeStackก่อนที่จะใช้สแต็ก
- ผลักดันไอเท็มบนสแต็กโดยการเรียก:รูทีนย่อยPush
- ป๊อปไอเท็มออกจากสแต็กโดยเรียกรูทีนย่อย: Pop
- ตัวแปร$ Countจะมีจำนวนรายการในสแต็กเสมอ
- ตัวแปร$ Topจะมีรายการล่าสุดที่เพิ่มไปยังสแต็กเสมอ
- ตัวแปร$ Bottomจะมีรายการแรกที่ถูกเพิ่มลงในสแต็กเสมอ
- คุณสามารถดัมพ์เนื้อหาของสแต็กได้โดยเรียกรูทีนย่อย: DumpStack
- ประเภทของรายการที่คุณสามารถกดลงบนสแต็กคืออะไรก็ได้ที่สามารถเก็บไว้ในตัวแปรได้ ยกตัวอย่างเช่นการโทร: กด "String 1" , โทร: กด "% 1" , โทร: กด "%% myVariable"ฯลฯ
ฉันใช้สแต็คในไฟล์แบตช์ของฉันเพื่อติดตามการเรียกรูทีนย่อย ย่อยในไฟล์ชุดของฉันทุกคนเริ่มต้นด้วยการโทร: กด 0%ซึ่งผลักดันให้ชื่อ subroutine ปัจจุบันบนสแต็คและจบลงด้วยการโทร: ป๊อป
บางคนอาจพบว่ามันมากกว่าการฆ่าสำหรับการเขียนสคริปต์ชุด แต่ผมมีความสุขกับการสร้างมันและฉันหวังว่าคนจะพบว่ามีประโยชน์นี้เพลิดเพลินไปกับ
@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
หรือไม่?