932 Stimmen

Festlegen von Windows PowerShell-Umgebungsvariablen

Ich habe herausgefunden, dass das Setzen der Umgebungsvariablen PATH nur die alte Eingabeaufforderung beeinflusst. PowerShell scheint andere Umgebungseinstellungen zu haben. Wie kann ich die Umgebungsvariablen für PowerShell (v1) ändern?

Anmerkung:

Ich möchte meine Änderungen dauerhaft machen, damit ich sie nicht jedes Mal, wenn ich PowerShell ausführe, neu einstellen muss. Verfügt PowerShell über eine Profildatei? So etwas wie ein Bash-Profil unter Unix?

1 Stimmen

Ich würde gerne ein zentrales Profil auf einer Dateifreigabe haben. Die Synchronisierung ist mühsam. Das Erstellen eines Stub-Profils mit . \\computer\share\path\Profile.ps1 erscheint wie ein Kunstgriff (versuchen Sie Notepad $Profile). Es wäre schön, wenn es eine Möglichkeit gäbe, die automatische Variable $Profile dauerhaft zu ändern.

5 Stimmen

Nein die PATH-Umgebung tut auch die Powershell-Eingabeaufforderung beeinflussen. Der Unterschied besteht jedoch darin, dass powershell keine in Anführungszeichen eingeschlossenen Pfade akzeptiert. Lösung: Entfernen Sie alle eingeschlossenen Anführungszeichen ( " ) in der Umgebungsvariablen path

4 Stimmen

WENN SIE HIER LANDEN FÜR PS > v1... Im Anschluss an Nilzors Kommentar oben: Verwenden Sie dies, um alle " aus den Pfaden in der Umgebungsvariablen PATH für Ihre Sitzung zu entfernen: $($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str

817voto

mloskot Punkte 34861

Wenn Sie zu irgendeinem Zeitpunkt während einer PowerShell-Sitzung die folgenden Informationen benötigen vorübergehend die Umgebungsvariable PATH zu ändern, können Sie einen der folgenden Befehle eingeben:

$env:Path                             # shows the actual content
$env:Path = 'C:\foo;' + $env:Path     # attach to the beginning
$env:Path += ';C:\foo'                # attach to the end

4 Stimmen

+1 :: Dieser Einzeiler ist sehr effektiv für sitzungsbasierte Aufrufe wie bei mingw ... D.h. $env:PATH += ";c: \MinGW\msys\1.0\bin " ^ {some mingw bin ... }

3 Stimmen

Und wie kann ich einen Pfad entfernen?

0 Stimmen

@becko neue SO Frage stellen. Es geht speziell um Einstellung env-Variable.

763voto

JaredPar Punkte 699699

Die aktuellen Umgebungsvariablen können wie folgt geändert werden mit Hilfe der env: namespace / drive Informationen. Zum Beispiel wird dieser Code wird die Umgebungsvariable path aktualisiert:

$env:Path = "SomeRandomPath";             (replaces existing path) 
$env:Path += ";SomeRandomPath"            (appends to existing path)

Den Wandel dauerhaft gestalten

Es gibt Möglichkeiten, Umgebungseinstellungen dauerhaft zu machen, aber wenn Sie sie nur von der PowerShell aus verwenden, ist es wahrscheinlich viel besser, die Powershell Profile Drehbuch.

Jedes Mal, wenn eine neue Instanz von Powershell startet, sucht sie nach bestimmten Skriptdateien (namens Profil Dateien) und führen sie aus, wenn sie existieren. Sie können eines dieser Profile bearbeiten, um Ihre Umgebung anzupassen.

Um zu wissen, wo diese Profil Skripte befinden sich in Ihrem Computertyp:

$profile                                     
$profile.AllUsersAllHosts           
$profile.AllUsersCurrentHost        
$profile.CurrentUserAllHosts    
$profile.CurrentUserCurrentHost     

Sie können eines davon bearbeiten, indem Sie z. B. tippen:

notepad $profile

51 Stimmen

$profile ist eine automatische Variable, die auf Ihr Benutzerprofil für alle PowerShell-Hosts verweist.

16 Stimmen

Beachten Sie, dass (split-path $profile) (um den enthaltenen Ordner zu erhalten) mehrere Profildateien enthalten kann: profile.ps1 sollte von allen Hosts geladen werden, <host-name>_profile.ps1 nur von dem angegebenen Host. Für PowerShell.exe (Konsolenhost) ist dies Microsoft.PowerShell_profile.ps1.

15 Stimmen

Was ist, wenn ich keinen Ordner WindowsPowerShell in meinen Dokumenten habe? Soll ich den Ordner und die Datei erstellen? Was sollte ich in die Datei schreiben, wenn ich Folgendes hinzufügen möchte C:\path\to\file.ext zu den Umgebungsvariablen? EDIT: Habe es bereits gefunden. Die Antwort ist ja, erstellen Sie sie. Die Datei sollte aus 1 Zeile bestehen: $env:path += ;C:\path\to\file.ext" .

447voto

hoge Punkte 4009

Sie können auch die Umgebungsvariablen von Benutzer und System ändern dauerhaft (d.h. sie bleibt über Shell-Neustarts hinweg bestehen) mit dem Folgenden:

Ändern einer Systemumgebungsvariablen

[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

Ändern einer Umgebungsvariablen des Benutzers

[Environment]::SetEnvironmentVariable
     ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)

Verwendung von Kommentaren - zur Systemumgebungsvariable hinzufügen

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
    [EnvironmentVariableTarget]::Machine)

Eine String-basierte Lösung ist auch möglich, wenn Sie keine Typen schreiben wollen

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")

9 Stimmen

Dies ist sehr nützlich für Systeme mit beschränktem Zugang.

21 Stimmen

@AndresRiofrio, Ja, das ist dauerhaft. Verwendung: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) Sie werden das Ergebnis dieser Änderung erst sehen, wenn Sie eine neue Powershell-Sitzung starten. Das heißt, wenn Sie $env:Path unmittelbar nach der Ausführung dieses Befehls überprüfen, sehen Sie, was $env:Path vor dem Befehl war. Zur Aktualisierung schließen und öffnen Sie die Shell oder starten Sie eine neue Sitzung.

8 Stimmen

@FLGMwt Sie haben einen Tippfehler, richtig ist: [Umgebung]::SetEnvironmentVariable("Pfad", $env:Pfad + "; C:\bin ", [EnvironmentVariableTarget]::Maschine)

80voto

tjb Punkte 10921

WARNUNG: Speichern Sie eine Kopie Ihres bestehenden Pfads, indem Sie $env:path >> a.out in einer PowerShell-Eingabeaufforderung, für den Fall, dass etwas schief geht.

An der PowerShell-Eingabeaufforderung:

setx PATH "$env:path;\the\directory\to\add" -m

Sie sollten dann den Text sehen:

SUCCESS: Specified value was saved.

Starten Sie Ihre Sitzung neu, und die Variable wird verfügbar sein. setx kann auch verwendet werden, um beliebige Variablen zu setzen. Typ setx /? bei der Aufforderung zur Dokumentation.

6 Stimmen

Scheint nur zu funktionieren, wenn es als Administrator ausgeführt wird, und wirkt sich danach nur auf PowerShell-Konsolen aus, die als Administrator ausgeführt werden, nicht auf regulär ausgeführte Konsolen.

1 Stimmen

18 Stimmen

Autsch - ich wurde gerade von der 1024-Zeichen-Beschränkung von setx getroffen; zum Glück habe ich den Rat befolgt, den vorhandenen Wert von $end:Path zu speichern. Nur etwas, das man beachten sollte: superuser.com/questions/387619/

45voto

Michael Kropat Punkte 13402

Wie JeanTs Antwort Ich wollte eine Abstraktion um das Hinzufügen zum Pfad. Im Gegensatz zu JeanT's Antwort brauchte ich es, um ohne Benutzerinteraktion laufen. Anderes Verhalten, das ich suchte:

  • Aktualisierungen $env:Path damit die Änderung in der aktuellen Sitzung wirksam wird
  • Behält die Änderung der Umgebungsvariablen für zukünftige Sitzungen bei
  • Fügt keinen doppelten Pfad hinzu, wenn derselbe Pfad bereits existiert

Falls es nützlich ist, hier ist es:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session'
    )

    if ($Container -ne 'Session') {
        $containerMapping = @{
            Machine = [EnvironmentVariableTarget]::Machine
            User = [EnvironmentVariableTarget]::User
        }
        $containerType = $containerMapping[$Container]

        $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
        if ($persistedPaths -notcontains $Path) {
            $persistedPaths = $persistedPaths + $Path | where { $_ }
            [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
        }
    }

    $envPaths = $env:Path -split ';'
    if ($envPaths -notcontains $Path) {
        $envPaths = $envPaths + $Path | where { $_ }
        $env:Path = $envPaths -join ';'
    }
}

Überprüfen Sie was ich sagen will für die entsprechende Remove-EnvPath Funktion.

1 Stimmen

Ich habe die folgende kleine Funktion zu meinem Profil hinzugefügt: function Set-Env ([string]$Name, [string]$Value, [string]$Target = 'User') { Set-Item "Env:$Name" $Value [System.Environment]::SetEnvironmentVariable($Name, $Value, $Target) } Es macht das Leben mit PowerShell so viel einfacher

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X