Ich habe herausgefunden, dass das Festlegen der Umgebungsvariablen PATH nur die alte Eingabeaufforderung betrifft. PowerShell scheint unterschiedliche Umgebungseinstellungen zu haben. Wie ändere ich die Umgebungsvariablen für PowerShell (v1)?
Hinweis:
Ich möchte meine Änderungen dauerhaft vornehmen, damit ich sie nicht jedes Mal festlegen muss, wenn ich PowerShell ausführe. Hat PowerShell eine Profildatei? So etwas wie Bash-Profil unter Unix?
windows
powershell
Vasil
quelle
quelle
"
) in der$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Antworten:
Das Ändern der tatsächlichen Umgebungsvariablen kann mithilfe der
env: namespace / drive
Informationen erfolgen. Dieser Code aktualisiert beispielsweise die Pfadumgebungsvariable:Es gibt Möglichkeiten, Umgebungseinstellungen dauerhaft zu machen. Wenn Sie sie jedoch nur in PowerShell verwenden, ist es wahrscheinlich viel besser, Ihr Profil zum Initiieren der Einstellungen zu verwenden. Beim Start führt PowerShell alle .ps1- Dateien aus, die sich im
WindowsPowerShell
Verzeichnis unter " Eigene Dateien " befinden. In der Regel ist bereits eine Datei profile.ps1 vorhanden. Der Pfad auf meinem Computer istquelle
C:\path\to\file.ext
den Umgebungsvariablen hinzufügen möchte ? EDIT: habe es schon gefunden. Antwort ist ja, erstellen Sie es. Die Datei sollte aus 1 Zeile bestehen :$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
Stattdessen - siehe @mloskot unten.Wenn Sie während einer PowerShell-Sitzung einige Zeit vorübergehend an die Umgebungsvariable PATH anhängen müssen, können Sie dies folgendermaßen tun:
quelle
$env:Path = "C:\MyPath;$env:Path"
Sie können Benutzer- / Systemumgebungsvariablen auch dauerhaft ändern (dh über Shell-Neustarts hinweg bleiben).
Ändern Sie eine Systemumgebungsvariable
Ändern Sie eine Benutzerumgebungsvariable
Verwendung aus Kommentaren - Zur Systemumgebungsvariablen hinzufügen
Eine stringbasierte Lösung ist auch möglich, wenn Sie keine Typen schreiben möchten
quelle
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
Das Ergebnis dieser Änderung wird erst angezeigt, wenn Sie eine neue Powershell-Sitzung starten. Wenn Sie also $ env: Path unmittelbar nach dem Ausführen dieses Befehls überprüfen, sehen Sie, was $ env: Path vor dem Befehl war. Zum Aktualisieren schließen und öffnen Sie die Shell oder starten Sie eine neue Sitzung.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Über die PowerShell-Eingabeaufforderung:
Sie sollten dann den Text sehen:
Starten Sie Ihre Sitzung neu, und die Variable ist verfügbar.
setx
kann auch verwendet werden, um beliebige Variablen festzulegen. Geben Siesetx /?
an der Eingabeaufforderung zur Dokumentation ein.Stellen Sie sicher, dass Sie eine Kopie Ihres vorhandenen Pfads speichern, bevor Sie auf diese Weise mit Ihrem Pfad herumspielen, indem Sie dies
$env:path >> a.out
in einer PowerShell-Eingabeaufforderung tun .quelle
$env:PATH
zuerst festlegen ,setx /m PATH "$env:PATH"
damit es lokal und global ohne Neustart der Shell angewendet wird?Wie die Antwort von JeanT wollte ich eine Abstraktion, um den Pfad zu erweitern. Im Gegensatz zu JeanTs Antwort musste es ohne Benutzerinteraktion ausgeführt werden. Anderes Verhalten, nach dem ich gesucht habe:
$env:Path
damit die Änderung in der aktuellen Sitzung wirksam wirdFalls es nützlich ist, hier ist es:
Schauen Sie sich meine Liste für die entsprechende
Remove-EnvPath
Funktion an.quelle
Obwohl die aktuell akzeptierte Antwort in dem Sinne funktioniert, dass die Pfadvariable im Kontext von PowerShell dauerhaft aktualisiert wird, wird die in der Windows-Registrierung gespeicherte Umgebungsvariable nicht aktualisiert.
Um dies zu erreichen, können Sie natürlich auch PowerShell verwenden:
Weitere Informationen finden Sie im Blogbeitrag. Verwenden Sie PowerShell, um Ihren Umgebungspfad zu ändern
Wenn Sie PowerShell-Community-Erweiterungen verwenden, lautet der richtige Befehl zum Hinzufügen eines Pfads zum Pfad der Umgebungsvariablen:
quelle
Alle Antworten, die auf eine dauerhafte Änderung hinweisen, haben das gleiche Problem: Sie unterbrechen den Pfadregistrierungswert.
SetEnvironmentVariable
wandelt denREG_EXPAND_SZ
Wert%SystemRoot%\system32
in einenREG_SZ
Wert von umC:\Windows\system32
.Alle anderen Variablen im Pfad gehen ebenfalls verloren. Das Hinzufügen neuer mit
%myNewPath%
wird nicht mehr funktionieren.Hier ist ein Skript
Set-PathVariable.ps1
, mit dem ich dieses Problem behebe:Ich erkläre das Problem ausführlicher in einem Blog-Beitrag .
quelle
Dadurch wird der Pfad für die aktuelle Sitzung festgelegt und der Benutzer aufgefordert, ihn dauerhaft hinzuzufügen:
Sie können diese Funktion zu Ihrem Standardprofil (
Microsoft.PowerShell_profile.ps1
) hinzufügen , das sich normalerweise unter befindet%USERPROFILE%\Documents\WindowsPowerShell
.quelle
Aufbauend auf der Antwort von @Michael Kropat habe ich einen Parameter hinzugefügt, um den neuen Pfad der vorhandenen
PATH
Variablen voranzustellen , und eine Überprüfung, um das Hinzufügen eines nicht vorhandenen Pfads zu vermeiden:quelle
Wie Jonathan Leaders hier erwähnt hat , ist es wichtig, den Befehl / das Skript mit erhöhten Rechten auszuführen , um Umgebungsvariablen für 'machine' ändern zu können. Das Ausführen einiger Befehle mit erhöhten Rechten muss jedoch nicht mit den Community-Erweiterungen durchgeführt werden Um die Antwort von JeanT so zu ändern und zu erweitern , dass das Ändern von Maschinenvariablen auch dann durchgeführt werden kann, wenn das Skript selbst nicht erhöht ausgeführt wird:
quelle
Die meisten Antworten richten sich nicht an die Benutzerkontensteuerung . Dies deckt UAC-Probleme ab.
Installieren Sie zuerst PowerShell Community Extensions:
choco install pscx
über http://chocolatey.org/ (möglicherweise müssen Sie Ihre Shell-Umgebung neu starten).Aktivieren Sie dann pscx
Dann benutze
Invoke-Elevated
quelle
Mein Vorschlag ist dieser:
Ich habe dies getestet, um
C:\oracle\x64\bin
esPath
dauerhaft zur Umgebungsvariablen hinzuzufügen , und dies funktioniert einwandfrei.Der erste Weg ist einfach zu tun:
Diese Änderung ist jedoch nicht dauerhaft.
$env:path
Sobald Sie Ihr PowerShell-Terminal schließen und erneut öffnen, wird standardmäßig auf den vorherigen Wert zurückgegriffen. Dies liegt daran, dass Sie die Änderung auf Sitzungsebene und nicht auf Quellenebene (der Registrierungsebene) angewendet haben. Gehen Sie wie folgt vor, um den globalen Wert von anzuzeigen$env:path
:Oder genauer:
Um dies zu ändern, erfassen wir zunächst den ursprünglichen Pfad, der geändert werden muss:
Nun definieren wir, wie der neue Pfad aussehen soll. In diesem Fall fügen wir einen neuen Ordner hinzu:
Hinweis: Stellen Sie sicher, dass die
$newpath
Aussehen so ist, wie Sie es möchten. Wenn nicht, können Sie Ihr Betriebssystem beschädigen.Wenden Sie nun den neuen Wert an:
Führen Sie nun eine letzte Überprüfung durch, um festzustellen, wie es aussieht:
Sie können jetzt Ihr PowerShell-Terminal neu starten (oder sogar den Computer neu starten) und feststellen, dass es nicht wieder auf den alten Wert zurückgesetzt wird.
Beachten Sie, dass sich die Reihenfolge der Pfade möglicherweise in alphabetischer Reihenfolge ändert. Überprüfen Sie daher die gesamte Zeile. Zur Vereinfachung können Sie die Ausgabe in Zeilen aufteilen, indem Sie das Semikolon als Trennzeichen verwenden:
quelle
Öffnen Sie PowerShell und führen Sie Folgendes aus:
quelle
In PowerShell können Sie zum Umgebungsvariablenverzeichnis navigieren, indem Sie Folgendes eingeben:
Dadurch gelangen Sie in das Verzeichnis Env:>. Aus diesem Verzeichnis heraus:
Geben Sie Folgendes ein, um alle Umgebungsvariablen anzuzeigen:
Geben Sie Folgendes ein, um eine bestimmte Umgebungsvariable anzuzeigen:
Geben Sie Folgendes ein, um eine Umgebungsvariable festzulegen:
Geben Sie Folgendes ein, um eine Umgebungsvariable zu entfernen:
Weitere Informationen finden Sie unter Informationen zu Umgebungsvariablen .
quelle
Ich habe versucht, den Code von SBF und Michael ein wenig zu optimieren , um ihn kompakter zu machen.
Ich verlasse mich auf den Typzwang von PowerShell, bei dem Zeichenfolgen automatisch in Aufzählungswerte konvertiert werden, sodass ich das Suchwörterbuch nicht definiert habe.
Ich habe auch den Block herausgezogen, der den neuen Pfad basierend auf einer Bedingung zur Liste hinzufügt, sodass die Arbeit einmal ausgeführt und zur Wiederverwendung in einer Variablen gespeichert wird.
Es wird dann permanent oder nur auf die Sitzung angewendet, je nach
$PathContainer
Parameter .Wir können den Codeblock in eine Funktion oder eine ps1-Datei einfügen, die wir direkt an der Eingabeaufforderung aufrufen. Ich habe mich für DevEnvAddPath.ps1 entschieden.
Ich mache etwas Ähnliches für eine DevEnvRemovePath.ps1.
Bisher scheinen sie zu funktionieren.
quelle
Nur die Antworten, die den Wert in die Registrierung übertragen, wirken sich auf eine dauerhafte Änderung aus (daher wirkt sich die Mehrheit der Antworten in diesem Thread, einschließlich der akzeptierten Antwort, nicht dauerhaft auf die aus
Path
).Die folgende Funktion funktioniert sowohl für
Path
/PSModulePath
als auch fürUser
/System
Typen. Standardmäßig wird auch der neue Pfad zur aktuellen Sitzung hinzugefügt.quelle