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


10

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

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

回答:


13

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-例えば、または何らかの理由で。パス変数のプッシュ/ポップに特に興味があります。バックアップ/復元に反対することはありPATHますか?
Wolf

実際には、例と重要な変更がパスに適用されている間は、予防策を講じています。@wolf
LotPings

確かに、すべてのケースで確実なわけではありませんが、特定のセッションのパスのみに何かを追加する必要がある場合は、パスを後で復元することに間違いはありません。他のツールを呼び出し、それらがパスにあると期待する外部ツールがなかった場合、これを行う必要はありません。
Wolf

1
環境全体を復元したい場合は、コードを変更して利用できます。findstrをtypeに置き換えるだけです。
LotPings 2017年

ありがとう、私は重要なことを見落とさないようにしたかっただけです。
Wolf

1

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


これは、一見したところ、おそらく開発に多少の労力を要したものであり、おそらく誰かにとって役立つものであるように見えます。これがこの質問回答を提供
スコット

使用できるすべての環境変数をプッシュするためのポイントがわかります。使用できるすべての環境変数 For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" を復元 For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) するには、これを実装する2つのサブルーチンを含めるように回答を更新しました。
Safwan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.