Existe-t-il un moyen de pousser et de faire apparaître toutes les variables d'environnement dans un script batch?

10

Existe-t-il un moyen de pousser et de faire apparaître toutes les variables d'environnement dans un script batch? Par exemple, je voudrais faire quelque chose comme ceci:

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

Réponses:

13

Utilisez setlocal, voir 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

Pour enregistrer l'état de variable actuel, vous pouvez le faire

set >MyVarStatus.txt

et restaurer plus tard avec

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

cela exclurait les variables Path.

LotPings
la source
Vous excluez PATH- juste par exemple ou pour une raison quelconque. Je suis particulièrement intéressé par push / pop la variable path. Y a-t-il quelque chose qui parle contre la sauvegarde / restauration PATH?
Wolf
En fait à la fois, un exemple et dans le cas où des changements importants ont été appliqués au chemin en attendant une précaution. @wolf
LotPings
Eh bien, vous ne pouvez pas être sûr dans tous les cas, mais si vous devez ajouter quelque chose au chemin pour une session spécifique uniquement, vous êtes certainement intéressé à restaurer le chemin par la suite. Vous n'auriez pas à le faire s'il n'y avait pas d'outils externes qui appellent d'autres outils et s'attendent à ce qu'ils soient sur le chemin.
Wolf
1
Le code est ouvert aux modifications, si l'on veut restaurer tout l'environnement, il suffit de remplacer findstr par type.
LotPings
Merci, je voulais juste être sûr de ne rien oublier d'important.
Wolf
1

Un peu tard pour la scène mais ça passe quand même. Vous trouverez ci-dessous une implémentation d'une structure de données de pile dans les scripts batch de Windows.

Fonctionnalités:

  • Vous devez appeler le sous-programme : InitializeStack avant d'utiliser la pile.
  • Poussez les éléments sur la pile en appelant le sous-programme : Poussez .
  • Sortez les éléments de la pile en appelant le sous-programme : Pop .
  • La variable $ Count contiendra toujours le nombre d'éléments de la pile.
  • La variable $ Top contiendra toujours l'élément le plus récent ajouté à la pile.
  • La variable $ Bottom contiendra toujours le premier élément ajouté à la pile.
  • Vous pouvez vider le contenu de la pile en appelant le sous-programme : DumpStack .
  • Le type d'éléments que vous pouvez pousser sur la pile est tout ce qui peut être stocké dans une variable. Par exemple, appel: appuyez sur "Chaîne 1" , appel: appuyez sur "% 1" , appel: appuyez sur "% MyVariable%" , etc.

J'utilise la pile dans mes fichiers de commandes pour suivre les appels de sous-programme. Chaque sous-programme dans mes fichiers de commandes commence par Call: Push% 0 , qui pousse le nom du sous-programme actuel sur la pile et se termine par Call: Pop .

Certains trouveront peut-être un sur-kill pour les scripts batch mais j'ai aimé le créer et j'espère que quelqu'un trouvera cela utile, profitez-en .

@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

Ainsi, pour pousser toutes les variables d'environnement, vous pouvez appeler: PushAllEnvironmentVariables, pour restaurer toutes les variables d'environnement, vous pouvez appeler: PopAllEnvironmentVariables

Safwan
la source
Cela semble - en un coup d'œil - être quelque chose qui a peut-être demandé un certain effort de développement et qui pourrait être utile à quelqu'un. Pouvez - vous expliquer comment cela fournit une réponse à cette question ?
Scott
Je vois votre point, pour pousser toutes les variables d'environnement que vous pouvez utiliser: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Pour restaurer toutes les variables d'environnement que vous pouvez utiliser: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) J'ai mis à jour la réponse pour inclure 2 sous-programmes qui implémentent cela.
Safwan