216 votes

PowerShell : Définition d'une variable d'environnement pour une seule commande

Sous Linux, je peux le faire :

$ FOO=BAR ./myscript

pour appeler "myscript" avec la variable d'environnement FOO.

Est-il possible de faire quelque chose de similaire avec PowerShell, c'est-à-dire sans devoir d'abord définir la variable, appeler la commande, puis redéfinir la variable ?

Pour être plus clair sur mon cas d'utilisation, je ne veux pas l'utiliser dans le cadre d'un script. J'ai plutôt un script tiers dont je peux contrôler le comportement à l'aide de variables d'environnement, mais, dans ce cas, pas d'arguments de ligne de commande. Ainsi, le fait de pouvoir alterner entre la saisie de

$ OPTION=1 ./myscript

y

$ ./myscript

serait très pratique.

127voto

Keith Hill Points 73162

En général, il est préférable de transmettre des informations au script par le biais d'un paramètre plutôt que d'une fonction variable globale (d'environnement). Mais si c'est ce que vous devez faire, vous pouvez le faire de cette manière :

$env:FOO = 'BAR'; ./myscript

La variable d'environnement $env:FOO peut être supprimée ultérieurement comme suit :

Remove-Item Env:\FOO

38voto

Alexander Fadeev Points 790

2 façons simples de le faire en une seule ligne :

$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO

Je n'ai fait que résumer des informations tirées d'autres réponses (merci à tous) qui, pour une raison ou une autre, ne contiennent pas de phrases toutes faites.

28voto

kizzx2 Points 6919

J'ai été suffisamment motivé par ce problème pour aller de l'avant et écrire un script pour lui : avec-env.ps1

Utilisation :

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

En revanche, si vous installez Gow vous pouvez utiliser env.exe qui pourrait être un peu plus robuste que le rapide script que j'ai écrit ci-dessus.

Utilisation :

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command

20voto

golvok Points 486

La création d'un "subshell" en invoquant powershell avec un bloc script permet d'étendre les modifications à l'environnement :

pwsh -Command { $env:MYVAR="myvalue"; .\path\to.exe }

9voto

Jason R. Coombs Points 11130

Pour obtenir l'équivalent de la syntaxe Unix, il faut non seulement définir la variable d'environnement, mais aussi la réinitialiser à sa valeur initiale après l'exécution de la commande. J'ai réalisé cela pour les commandes courantes que j'utilise en ajoutant à mon profil PowerShell des fonctions similaires à celles qui suivent.

function cmd_special()
{
  $orig_master = $env:app_master
  $env:app_master = 'http://host.example.com'
  mycmd $args
  $env:app_master = $orig_master
}

Donc mycmd est un exécutable qui fonctionne différemment en fonction de la valeur de la variable d'environnement app_master . En définissant cmd_special Je peux maintenant exécuter cmd_special à partir de la ligne de commande (y compris les autres paramètres) avec l'option app_master et elle est réinitialisée (ou même désactivée) après l'exécution de la commande.

On peut supposer qu'il est également possible de le faire de manière ad hoc pour une invocation unique.

& { $orig_master = $env:appmaster; $env:app_master = 'http://host.example.com'; mycmd $args; $env:app_master = $orig_master }

Cela devrait être plus simple que cela, mais apparemment ce n'est pas un cas d'utilisation qui est facilement pris en charge par PowerShell. Peut-être qu'une future version (ou une fonction tierce) facilitera ce cas d'utilisation. Il serait intéressant que PowerShell dispose d'une cmdlet permettant de réaliser cette opération, par exemple :

with-env app_master='http://host.example.com' mycmd

Peut-être qu'un gourou de PowerShell peut nous suggérer comment écrire une telle cmdlet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X