C'è un modo per spingere e pop tutte le variabili d'ambiente in uno script batch?


10

C'è un modo per spingere e pop tutte le variabili d'ambiente in uno script batch? Ad esempio, vorrei fare qualcosa del genere:

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

Risposte:


13

Utilizzare setlocal, consultare setlocal /?o ss64.com/nt/setlocal

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

Per salvare lo stato variabile corrente che potresti fare

set >MyVarStatus.txt

e ripristina in seguito con

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

questo escluderebbe le variabili Path.


Si esclude PATH- solo per esempio o per qualche motivo. Sono particolarmente interessato a spingere / pop la variabile path. C'è qualcosa che parla contro il backup / ripristino PATH?
Lupo,

In effetti, sia un esempio sia nel caso importanti cambiamenti sono stati applicati al percorso nel frattempo una precauzione. @wolf
LotPings,

Bene, non puoi essere sicuro in tutti i casi, ma se devi aggiungere qualcosa al percorso solo per una sessione specifica, sei sicuramente interessato a ripristinare il percorso in seguito. Non dovresti farlo se non ci fossero strumenti esterni che chiamano altri strumenti e si aspettano che siano sul percorso.
Lupo,

1
Il codice è aperto alle modifiche, se si desidera ripristinare l'intero ambiente è sufficiente sostituire findstr con type.
LotPings,

Grazie, volevo solo essere sicuro di non trascurare nulla di importante.
Lupo,

1

Un po 'in ritardo sulla scena, ma qui va comunque. Di seguito è riportata un'implementazione di una struttura di dati dello stack negli script batch di Windows.

Caratteristiche:

  • È necessario chiamare la subroutine : InitializeStack prima di utilizzare lo stack.
  • Spingi gli oggetti in pila chiamando il : Sottoprogramma push .
  • Rimuovi gli oggetti dallo stack chiamando la subroutine : Pop .
  • La variabile $ Count conterrà sempre il conteggio degli oggetti nella pila.
  • La variabile $ Top conterrà sempre l'elemento più recente aggiunto allo stack.
  • La variabile $ Bottom conterrà sempre il primo oggetto aggiunto alla pila.
  • È possibile scaricare il contenuto dello stack chiamando la subroutine : DumpStack .
  • Il tipo di elementi che è possibile inserire nello stack è qualsiasi cosa che può essere archiviata in una variabile. Ad esempio, Call: Push "String 1" , Call: Push "% 1" , Call: Push "% MyVariable%" , ecc.

Uso lo stack nei miei file batch per tenere traccia delle chiamate di subroutine. Ogni subroutine nei miei file batch inizia con Call: Push% 0 , che inserisce il nome della subroutine corrente nello stack e termina con Call: Pop .

Alcuni potrebbero trovarlo un over-kill per gli script batch, ma mi è piaciuto crearlo e spero che qualcuno lo troverà utile, divertitevi .

@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

Quindi, per inviare tutte le variabili d'ambiente che puoi chiamare: PushAllEnvironmentVariables, per ripristinare tutte le variabili d'ambiente, puoi chiamare: PopAllEnvironmentVariables


Sembra, a prima vista, qualcosa che forse ha richiesto qualche sforzo per svilupparsi, e forse potrebbe essere utile a qualcuno. Puoi spiegare come questo fornisce una risposta a questa domanda ?
Scott,

Vedo il tuo punto, per spingere tutte le variabili d'ambiente che puoi usare: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Per ripristinare tutte le variabili d'ambiente che puoi usare: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Ho aggiornato la risposta per includere 2 subroutine che implementano questo.
Safwan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.