Gibt es eine Möglichkeit, alle Umgebungsvariablen in einem Batch-Skript zu verschieben und zu platzieren?

10

Gibt es eine Möglichkeit, alle Umgebungsvariablen in einem Batch-Skript zu verschieben und zu platzieren? Zum Beispiel möchte ich so etwas machen:

pushEnvironmentVariables
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
popEnvironmentVariables
pushEnvironmentVariables
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
popEnvironmentVariables
שלומי שטיין
quelle

Antworten:

13

Verwenden Sie setlocal, siehe setlocal /?oder ss64.com/nt/setlocal

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

Um den aktuellen Variablenstatus zu speichern, können Sie dies tun

set >MyVarStatus.txt

und später mit wiederherstellen

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

Dies würde die Pfadvariablen ausschließen.

LotPings
quelle
Sie schließen aus PATH- nur zum Beispiel oder aus irgendeinem Grund. Ich interessiere mich besonders für Push / Pop der Pfadvariablen. Gibt es etwas, das gegen Backup / Restore spricht PATH?
Wolf
In der Tat wurde sowohl ein Beispiel als auch für den Fall, dass wichtige Änderungen in der Zwischenzeit vorsichtshalber auf den Pfad angewendet wurden. @ Wolf
LotPings
Sie können nicht in allen Fällen sicher sein, aber wenn Sie dem Pfad nur für eine bestimmte Sitzung etwas hinzufügen müssen, sind Sie definitiv daran interessiert, den Pfad anschließend wiederherzustellen. Sie müssten dies nicht tun, wenn es keine externen Tools gäbe, die andere Tools aufrufen und erwarten, dass sie im Pfad sind.
Wolf
1
Der Code ist offen für Änderungen. Wenn Sie die gesamte Umgebung wiederherstellen möchten, ersetzen Sie einfach findstr durch type.
LotPings
Danke, ich wollte nur sichergehen, dass nichts Wichtiges übersehen wird.
Wolf
1

Ein bisschen spät zur Szene, aber hier geht es trotzdem. Im Folgenden finden Sie eine Implementierung einer Stapeldatenstruktur in Windows-Batch-Skripten.

Eigenschaften:

  • Sie müssen die Unterroutine : InitializeStack aufrufen, bevor Sie den Stack verwenden.
  • Verschieben Sie Elemente auf dem Stapel, indem Sie die Unterroutine : Push aufrufen .
  • Pop-Elemente vom Stapel, indem Sie die Unterroutine : Pop aufrufen .
  • Die Variable $ Count enthält immer die Anzahl der Elemente im Stapel.
  • Die Variable $ Top enthält immer das aktuellste Element, das dem Stapel hinzugefügt wurde.
  • Die Variable $ Bottom enthält immer das erste Element, das dem Stapel hinzugefügt wurde.
  • Sie können den Inhalt des Stapels sichern, indem Sie die Unterroutine : DumpStack aufrufen .
  • Die Art der Elemente, die Sie auf den Stapel verschieben können, ist alles, was in einer Variablen gespeichert werden kann. Beispiel: Call: Push "String 1" , Call: Push "% 1" , Call: Push "% MyVariable%" usw.

Ich verwende den Stapel in meinen Batchdateien, um Unterprogrammaufrufe zu verfolgen. Jede Unterroutine in meinen Batchdateien beginnt mit Call: Push% 0 , wodurch der Name der aktuellen Unterroutine auf den Stapel geschoben wird und mit Call: Pop endet .

Einige mögen es als Over-Kill für Batch-Scripting empfinden, aber ich habe es genossen, es zu erstellen, und ich hoffe, jemand wird dies nützlich finden, viel Spaß .

@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

Um alle Umgebungsvariablen zu pushen, die Sie aufrufen können: PushAllEnvironmentVariables, um alle Umgebungsvariablen wiederherzustellen, können Sie PopAllEnvironmentVariables aufrufen

Safwan
quelle
Auf den ersten Blick scheint dies etwas zu sein, dessen Entwicklung möglicherweise einige Mühe gekostet hat und das für jemanden nützlich sein könnte. Können Sie erklären, wie dies eine Antwort auf diese Frage liefert ?
Scott
Ich verstehe Ihren Punkt, um alle Umgebungsvariablen zu pushen, die Sie verwenden können: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" So stellen Sie alle Umgebungsvariablen wieder her, die Sie verwenden können: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Ich habe die Antwort aktualisiert, um 2 Unterroutinen einzuschließen, die dies implementieren.
Safwan