少し遅れましたが、とにかくここに行きます。以下は、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
ますか?