web-dev-qa-db-ja.com

バッチスクリプトですべての環境変数をプッシュおよびポップする方法はありますか?

バッチスクリプトですべての環境変数をプッシュおよびポップする方法はありますか?たとえば、私は次のようなことをしたいと思います。

pushEnvironmentVariables
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
popEnvironmentVariables
pushEnvironmentVariables
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
popEnvironmentVariables
10

Setlocalを使用します。setlocal /?または ss64.com/nt/setlocal を参照してください。

Setlocal
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
Endlocal
Setlocal
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
Endlocal

現在の変数の状態を保存するには、

set >MyVarStatus.txt

後で復元します

@Echo off
For /f "tokens=1* delims==" %%A in (
  'findstr /V "^Path" MYVarStatus.txt '
) Do Set %%A=%%B

これにより、Path変数が除外されます。

13
LotPings

シーンに少し遅れていますが、とにかくここに行きます。以下は、Windowsバッチスクリプトでのスタックデータ構造の実装です。

特徴:

  • あなたは電話する必要があります :InitializeStack スタックを使用する前のサブルーチン。
  • を呼び出して、スタック上のアイテムをプッシュします :押す サブルーチン。
  • を呼び出すことにより、スタックからアイテムをポップします :ポップ サブルーチン。
  • 変数 $ Count スタック内のアイテムの数が常に含まれます。
  • 変数 $ Top スタックに追加された最新のアイテムが常に含まれます。
  • 変数 $ Bottom スタックに追加された最初のアイテムが常に含まれます。
  • を呼び出すことにより、スタックの内容をダンプできます。 :DumpStack サブルーチン。
  • スタックにプッシュできるアイテムのタイプは、変数に格納できるものです。例えば、 呼び出し:「文字列1」を押す、 電話:プッシュ "%1"、 呼び出し:「%MyVariable%」を押す、など。

バッチファイルのスタックを使用して、サブルーチン呼び出しを追跡します。私のバッチファイルのすべてのサブルーチンはで始まります 呼び出し:プッシュ%0、現在のサブルーチンの名前をスタックにプッシュし、で終了します 電話:ポップ

バッチスクリプティングにはやり過ぎだと思う人もいるかもしれませんが、私はそれを作成するのを楽しんでいました。 楽しい

@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を呼び出すことができます。

1
Safwan