Czy istnieje sposób na wypchnięcie i usunięcie wszystkich zmiennych środowiskowych w skrypcie wsadowym?

10

Czy istnieje sposób na wypchnięcie i usunięcie wszystkich zmiennych środowiskowych w skrypcie wsadowym? Na przykład chciałbym zrobić coś takiego:

pushEnvironmentVariables
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
popEnvironmentVariables
pushEnvironmentVariables
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
popEnvironmentVariables
שטומי שטיין
źródło

Odpowiedzi:

13

Użyj setlocal, patrz setlocal /?lub ss64.com/nt/setlocal

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

Aby zapisać bieżący stan zmiennej, możesz to zrobić

set >MyVarStatus.txt

i przywróć później za pomocą

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

wykluczałoby to zmienne Path.

LotPings
źródło
Wykluczasz PATH- na przykład lub z jakiegoś powodu. Szczególnie interesuje mnie zmienna ścieżki push / pop. Czy jest coś, co przemawia przeciwko tworzeniu kopii zapasowych / przywracaniu PATH?
Wolf
W rzeczywistości zarówno przykład, jak i ważne zmiany zostały w międzyczasie zastosowane na ścieżce. @wolf
LotPings
Cóż, nie możesz być pewien we wszystkich przypadkach, ale jeśli musisz dodać coś do ścieżki tylko dla określonej sesji, na pewno chcesz przywrócić ścieżkę później. Nie musiałbyś tego robić, gdyby nie było zewnętrznych narzędzi, które wywołują inne narzędzia i oczekują, że będą na dobrej drodze.
Wolf
1
Kod jest otwarty na zmiany, jeśli chcesz przywrócić całe środowisko, po prostu zamień findstr na type.
LotPings,
Dzięki, chciałem tylko mieć pewność, że nie przeoczę niczego ważnego.
Wolf
1

Trochę za późno na scenę, ale i tak idzie. Poniżej znajduje się implementacja struktury danych stosu w skryptach wsadowych Windows.

Funkcje:

  • Przed użyciem stosu należy wywołać podprogram : InitializeStack .
  • Wciśnij przedmioty na stos, wywołując podprogram : Push .
  • Usuń elementy ze stosu, wywołując podprogram : Pop .
  • Zmienna $ Count zawsze będzie zawierała liczbę elementów na stosie.
  • Zmienna $ Top zawsze będzie zawierała najnowszy element dodany do stosu.
  • Zmienna $ Bottom zawsze będzie zawierać pierwszy element dodany do stosu.
  • Możesz zrzucić zawartość stosu, wywołując podprogram : DumpStack .
  • Typ elementów, które można wcisnąć na stos, to wszystko, co można przechowywać w zmiennej. Na przykład Call: Push „String 1” , Call: Push „% 1” , Call: Push „% MyVariable%” itp.

Używam stosu w plikach wsadowych do śledzenia wywołań podprogramów. Każdy podprogram w moich plikach wsadowych zaczyna się od Call: Push% 0 , który wypycha nazwę bieżącego podprogramu na stos i kończy się Call: Pop .

Niektórzy mogą go znaleźć nadmierne zabić skryptów wsadowych, ale cieszył się tworząc go i mam nadzieję, że ktoś znajdzie to użyteczne, cieszyć .

@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

Aby wypchnąć wszystkie zmienne środowiskowe, które możesz wywołać: PushAllEnvironmentVariables, aby przywrócić wszystkie zmienne środowiskowe, możesz wywołać: PopAllEnvironmentVariables

Safwan
źródło
Wygląda to - na pierwszy rzut oka - być czymś, co może wymagało trochę wysiłku, a może być przydatne dla kogoś. Czy możesz wyjaśnić, w jaki sposób stanowi to odpowiedź na to pytanie ?
Scott,
Rozumiem, o co ci chodzi, aby wypchnąć wszystkie zmienne środowiskowe, których możesz użyć: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Aby przywrócić wszystkie zmienne środowiskowe, których możesz użyć: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Zaktualizowałem odpowiedź, aby uwzględnić 2 podprogramy, które to implementują.
Safwan