Unter Linux kann ich:
$ FOO=BAR ./myscript
um "myscript" mit der Umgebungsvariablen FOO aufzurufen.
Ist in PowerShell etwas Ähnliches möglich, dh ohne zuerst die Variable setzen, den Befehl aufrufen und die Variable dann wieder deaktivieren zu müssen?
Um meinen Anwendungsfall klarer zu machen: 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, in diesem Fall jedoch keine Befehlszeilenargumente. So können Sie zwischen dem Tippen wechseln
$ OPTION=1 ./myscript
und
$ ./myscript
wäre einfach sehr praktisch.
windows
powershell
scripting
variables
environment
miracle2k
quelle
quelle
Antworten:
Im Allgemeinen ist es besser, Informationen über einen Parameter an das Skript zu übergeben, als über eine globale (Umgebungs-) Variable. Aber wenn Sie das tun müssen, können Sie es folgendermaßen tun:
Die Umgebungsvariable $ env: FOO kann später wie folgt gelöscht werden:
quelle
env:foo
auf den alten Wert zurücksetzen (möglicherweise nicht festgelegt), anstatt ihn zu entfernen?& {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}
... einige sagen vielleicht unhandlich , aber vermeiden Nebenwirkungen ...Ich war genug motiviert über dieses Problem, dass ich ein Skript dafür schrieb: with-env.ps1
Verwendung:
Auf der anderen Seite können Sie bei der Installation von Gow etwas verwenden,
env.exe
das möglicherweise etwas robuster ist als das oben geschriebene schnelle Skript.Verwendung:
quelle
Um das Äquivalent der Unix-Syntax zu erreichen, müssen Sie nicht nur die Umgebungsvariable festlegen, sondern sie nach Ausführung des Befehls auf den vorherigen Wert zurücksetzen. Ich habe dies für allgemeine Befehle erreicht, die ich verwende, indem ich meinem PowerShell-Profil Funktionen hinzugefügt habe, die den folgenden ähnlich sind.
Dies
mycmd
gilt auch für einige ausführbare Dateien, die je nach Wert der Umgebungsvariablen unterschiedlich funktionierenapp_master
. Durch Definierencmd_special
kann ich jetztcmd_special
über die Befehlszeile (einschließlich anderer Parameter) ausführen, wobei dieapp_master
Umgebungsvariable gesetzt ist ... und sie wird nach Ausführung des Befehls zurückgesetzt (oder sogar deaktiviert).Vermutlich können Sie dies auch ad-hoc für einen einzelnen Aufruf tun.
Es sollte wirklich einfacher sein, aber anscheinend ist dies kein Anwendungsfall, der von PowerShell ohne weiteres unterstützt wird. Möglicherweise erleichtert eine zukünftige Version (oder eine Funktion eines Drittanbieters) diesen Anwendungsfall. Es wäre schön, wenn PowerShell ein Cmdlet hätte, das dies tun würde, z.
Vielleicht kann ein PowerShell-Guru vorschlagen, wie man ein solches Cmdlet schreibt.
quelle
2 einfache Möglichkeiten, dies in einer einzigen Zeile zu tun:
Nur zusammengefasste Informationen aus anderen Antworten (danke Leute), die aus irgendeinem Grund keine reinen Einzeiler enthalten.
quelle
In Anbetracht der Tatsache, dass CMD die native CLI im Windows-Kernel ist (und immer noch die Automatisierungsschnittstelle für viele Tools ist), führen Sie Ihr PowerShell-Skript möglicherweise über
powershell.exe
die CMD-Eingabeaufforderung oder eine Schnittstelle aus, die CMD-Konsolenanweisungen akzeptiert.Wenn Sie den
-File
Parameter verwenden, an den Sie Ihr Skript übergeben,powershell.exe
kann kein anderer PowerShell-Code verwendet werden, um eine Umgebungsvariable für den Zugriff auf das Skript festzulegen. Stattdessen können Sie Ihre Umgebungsvariablen in der CMD-Umgebung festlegen, bevor Sie Folgendes aufrufenpowershell.exe
:Eine einzelne Funktion
&
funktioniert ebenfalls, ermöglicht jedoch die Fortsetzung des Befehls, wenn der Befehlset
aus irgendeinem Grund fehlgeschlagen ist. (Ist das überhaupt möglich? Ich habe keine Ahnung.)Es kann auch sicherer sein,
"foo=bar"
in Anführungszeichen zu setzen, damit nichts, was folgt,set
als variabler Inhalt übergeben wird.quelle
https://gist.github.com/bobalob/6632690e33747c13a8c00875ee686be2
quelle
Sie können Variablen auf Funktionen und Skripte beschränken.
New-Variable hat auch einen -scope-Parameter, wenn Sie formal sein und Ihre Variable mit new-variable deklarieren möchten.
quelle