webentwicklung-frage-antwort-db.com.de

Powershell: Festlegen einer Umgebungsvariablen nur für einen einzelnen Befehl

Unter Linux kann ich Folgendes tun:

$ FOO=BAR ./myscript

"myscript" aufzurufen, wenn die Umgebungsvariable FOO gesetzt ist.

Ist in Powershell etwas Ähnliches möglich, d. H. Ohne die Variable zuerst setzen zu müssen, den Befehl aufzurufen und dann die Variable erneut zu löschen?

Um mehr über meinen Anwendungsfall zu erfahren - ich möchte dies nicht als Teil eines Skripts verwenden. Ich habe vielmehr ein Skript eines Drittanbieters, dessen Verhalten ich mithilfe von Umgebungsvariablen steuern kann, aber in diesem Fall keine Befehlszeilenargumente. So können Sie zwischen dem Tippen wechseln

$ OPTION=1 ./myscript

und 

$ ./myscript

wäre einfach sehr praktisch.

55
miracle2k

Im Allgemeinen ist es besser, Informationen über einen Parameter an das Skript zu übergeben, als über eine globale Variable (.____.) (Umgebungsvariable). Aber wenn es das ist, was Sie tun müssen, können Sie es so machen:

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

Die Umgebungsvariable $ env: FOO kann später wie folgt gelöscht werden:

Remove-Item Env:\FOO
23
Keith Hill

Um das Äquivalent der Unix-Syntax zu erreichen, müssen Sie nicht nur die Umgebungsvariable festlegen, sondern sie nach der Ausführung des Befehls auf ihren früheren Wert zurücksetzen. Ich habe dies für allgemeine Befehle erreicht, die ich verwende, indem ich meinem Powershell-Profil Funktionen wie die folgenden hinzufügte.

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

mycmd ist also eine ausführbare Datei, die je nach dem Wert der Umgebungsvariablen app_master unterschiedlich arbeitet. Durch die Definition von cmd_special kann ich jetzt cmd_special von der Befehlszeile aus (einschließlich anderer Parameter) mit der Umgebungsvariablen app_master ausführen ... und sie wird nach Ausführung des Befehls zurückgesetzt (oder sogar deaktiviert).

Vermutlich könnten Sie dieses Ad-hoc auch für einen einzelnen Aufruf durchführen.

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

Es sollte wirklich einfacher sein als dies, aber anscheinend ist dies kein Anwendungsfall, der von Powershell leicht unterstützt wird. Möglicherweise wird eine zukünftige Version (oder Funktion von Drittanbietern) diesen Anwendungsfall erleichtern. Es wäre schön, wenn Powershell ein Cmdlet hätte, das dies tun würde, z.

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

Vielleicht kann ein Powershell-Guru vorschlagen, wie man ein solches Cmdlet schreibt.

2
Jason R. Coombs

Ich wurde genug über dieses Problem motiviert, dass ich ein Skript dafür geschrieben habe: with-env.ps1

Verwendungszweck:

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

Wenn Sie jedoch Gow installieren, können Sie env.exe verwenden, der möglicherweise etwas robuster ist als das oben beschriebene schnelle Skript.

Verwendungszweck:

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
2
kizzx2

In Anbetracht dessen, dass CMD die native CLI im Windows-Kernel ist (und immer noch die Automatisierungsschnittstelle für viele Tools ist), führen Sie möglicherweise Ihr PowerShell-Skript mit powershell.exe aus der CMD-Eingabeaufforderung oder einer Schnittstelle aus, die CMD-Konsolenanweisungen akzeptiert.

Wenn Sie den -File-Parameter verwenden, um Ihr Skript an powershell.exe zu übergeben, kann kein anderer PowerShell-Code verwendet werden, um eine Umgebungsvariable für das Skript festzulegen, auf die zugegriffen werden soll. Stattdessen können Sie Ihre Umgebungsvariablen in der CMD-Umgebung festlegen, bevor Sie powershell.exe aufrufen:

> set foo=bar && powershell.exe -File .\script.ps1

Ein einzelner & wird ebenfalls funktionieren, der Befehl kann jedoch fortgesetzt werden, wenn die set aus irgendeinem Grund fehlgeschlagen ist. (Ist das überhaupt möglich? Ich habe keine Ahnung.)

Es kann auch sicherer sein, "foo=bar" in Anführungszeichen einzugeben, sodass nichts, das folgt, als variabler Inhalt an set übergeben wird.

0
NReilingh