Existe uma maneira de enviar e exibir todas as variáveis ​​de ambiente em um script em lote?

10

Existe uma maneira de enviar e exibir todas as variáveis ​​de ambiente em um script em lote? Por exemplo, eu gostaria de fazer algo assim:

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

Respostas:

13

Use setlocal, ver setlocal /?ou ss64.com/nt/setlocal

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

Para salvar o estado atual da variável, você pode fazer

set >MyVarStatus.txt

e restaure mais tarde com

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

isso excluiria as variáveis ​​Path.

LotPings
fonte
Você exclui PATH- apenas por exemplo ou por algum motivo. Estou especialmente interessado em empurrar / pop a variável path. Existe algo que fale contra backup / restauração PATH?
Lobo
De fato, um exemplo e, no caso, mudanças importantes foram aplicadas ao caminho enquanto isso, uma precaução. @wolf
LotPings
Bem, você não pode ter certeza em todos os casos, mas se precisar adicionar algo ao caminho apenas para uma sessão específica, definitivamente está interessado em restaurar o caminho posteriormente. Você não precisaria fazer isso se não houvesse ferramentas externas que chamassem outras ferramentas e esperassem que elas estivessem no caminho.
Lobo
11
O código está aberto a alterações, se alguém quiser restaurar o ambiente inteiro, substitua findstr pelo tipo.
LotPings
Obrigado, eu só queria ter certeza de não esquecer nada importante.
Lobo
1

Um pouco tarde para a cena, mas aqui vai de qualquer maneira. Abaixo está uma implementação de uma estrutura de dados de pilha nos scripts em lotes do Windows.

Recursos:

  • Você deve chamar a sub-rotina : InitializeStack antes de usar a pilha.
  • Empurre itens na pilha chamando a : Sub- rotina Push .
  • Retire os itens da pilha chamando a sub-rotina : Pop .
  • A variável $ Count sempre conterá a contagem de itens na pilha.
  • A variável $ Top sempre conterá o item mais recente adicionado à pilha.
  • A variável $ Bottom sempre conterá o primeiro item adicionado à pilha.
  • Você pode despejar o conteúdo da pilha chamando a sub-rotina : DumpStack .
  • O tipo de itens que você pode enviar na pilha é qualquer coisa que possa ser armazenada em uma variável. Por exemplo, Chamada: Push "String 1" , Chamada: Push "% 1" , Chamada: Push "% MyVariable%" , etc.

Eu uso a pilha nos meus arquivos em lotes para acompanhar as chamadas de sub-rotina. Cada sub-rotina nos meus arquivos em lote começa com Chamada: pressione% 0 , que coloca o nome da sub-rotina atual na pilha e termina com Chamada: Pop .

Alguns podem achar que é um over-kill para execução de scripts em lote, mas eu apreciei o criar e espero que alguém vai encontrar este útil, desfrutar .

@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

Portanto, para enviar todas as variáveis ​​de ambiente por push, você pode chamar: PushAllEnvironmentVariables, para restaurar todas as variáveis ​​de ambiente, você pode chamar: PopAllEnvironmentVariables

Safwan
fonte
Parece - de relance - algo que talvez tenha exigido algum esforço para ser desenvolvido e que possa ser útil a alguém. Você pode explicar como isso fornece uma resposta para esta pergunta ?
Scott
Entendo que você deve empurrar todas as variáveis ​​de ambiente que você pode usar: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Para restaurar todas as variáveis ​​de ambiente que você pode usar: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Atualizei a resposta para incluir duas sub-rotinas que implementam isso.
Safwan