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

43voto

kia nasirzadeh Punkte 2328

HINWEIS 1: Führen Sie diese Befehle mit erweiterter Powershell aus (z. B. mit Administratorrechten)

HINWEIS 2: Schließen Sie nach jedem Schritt, damit Ihre Befehle funktionieren, die Sitzung und öffnen Sie sie erneut.

keine Kopfschmerzen für sich selbst machen, wollen eine einfache, einzeilige Lösung zu:

hinzufügen. a dauerhaft Umgebungsvariable:

[Environment]::SetEnvironmentVariable("NewEnvVar", "NewEnvValue", "Machine")

modifizieren/ändern das:

[Environment]::SetEnvironmentVariable("oldEnvVar", "NewEnvValue", "Machine")

löschen/entfernen das:

[Environment]::SetEnvironmentVariable("oldEnvVar", "", "Machine")

4 Stimmen

In der Tat sind all diese Setx & $Env Die Antworten bereiten mir Kopfschmerzen. Diese hier ist elegant!

0 Stimmen

Ich finde dieses Problem auch in meinem Windows 10 21H2 und PowerShell 5.1 in Windows Terminal -- Wir müssen die Sitzung schließen und erneut öffnen, um das Ergebnis zu überprüfen. Oder beide Befehle -- $ENV:ALICLOUD_ACCESSKEY_ID y [Environment]::GetEnvironmentVariable('ALICLOUD_ACCESSKEY_ID‌​') -- wird nur ein leeres Ergebnis zurückgeben. Ist das eine Art Fehler?

0 Stimmen

@JingHe Ich bin mir nicht sicher, ob man das als Fehler bezeichnen kann, es ist einfach die Art und Weise, wie sie es entworfen haben, und ich bin auch nicht sehr zufrieden damit!

22voto

gijswijs Punkte 1508

Obwohl die derzeit akzeptierte Antwort in dem Sinne funktioniert, dass die Pfadvariable permanent aus dem Kontext von PowerShell aktualisiert wird, wird die in der Windows-Registrierung gespeicherte Umgebungsvariable nicht wirklich aktualisiert.

Um dies zu erreichen, können Sie natürlich auch PowerShell verwenden:

$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath

Weitere Informationen finden Sie im Blogbeitrag Verwenden von PowerShell zum Ändern des Umgebungspfads

Wenn Sie PowerShell-Community-Erweiterungen verwenden, lautet der richtige Befehl zum Hinzufügen eines Pfads zur Umgebungsvariablen path:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine

21voto

Peter Hahndorf Punkte 10072

Alle Antworten, die eine dauerhafte Änderung vorschlagen, haben das gleiche Problem: Sie zerstören den Pfadregistrierungswert.

SetEnvironmentVariable dreht die REG_EXPAND_SZ Wert %SystemRoot%\system32 in eine REG_SZ Wert von C:\Windows\system32 .

Alle anderen Variablen im Pfad gehen ebenfalls verloren. Das Hinzufügen neuer Variablen mit %myNewPath% wird nicht mehr funktionieren.

Hier ist ein Skript Set-PathVariable.ps1 die ich zur Lösung dieses Problems verwende:

 [CmdletBinding(SupportsShouldProcess=$true)]
 param(
     [parameter(Mandatory=$true)]
     [string]$NewLocation)

 Begin
 {

 #requires –runasadministrator

     $regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
     $hklm = [Microsoft.Win32.Registry]::LocalMachine

     Function GetOldPath()
     {
         $regKey = $hklm.OpenSubKey($regPath, $FALSE)
         $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
         return $envPath
     }
 }

 Process
 {
     # Win32API error codes
     $ERROR_SUCCESS = 0
     $ERROR_DUP_NAME = 34
     $ERROR_INVALID_DATA = 13

     $NewLocation = $NewLocation.Trim();

     If ($NewLocation -eq "" -or $NewLocation -eq $null)
     {
         Exit $ERROR_INVALID_DATA
     }

     [string]$oldPath = GetOldPath
     Write-Verbose "Old Path: $oldPath"

     # Check whether the new location is already in the path
     $parts = $oldPath.split(";")
     If ($parts -contains $NewLocation)
     {
         Write-Warning "The new location is already in the path"
         Exit $ERROR_DUP_NAME
     }

     # Build the new path, make sure we don't have double semicolons
     $newPath = $oldPath + ";" + $NewLocation
     $newPath = $newPath -replace ";;",""

     if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){

         # Add to the current session
         $env:path += ";$NewLocation"

         # Save into registry
         $regKey = $hklm.OpenSubKey($regPath, $True)
         $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
         Write-Output "The operation completed successfully."
     }

     Exit $ERROR_SUCCESS
 }

Ich erkläre das Problem ausführlicher in einen Blogbeitrag .

2 Stimmen

Sollte dies sein: $newPath = $newPath -replace ";;",";" ?

12voto

ali Darabi Punkte 307

Mein Vorschlag ist dieser:

Ich habe dies getestet, um Folgendes hinzuzufügen C:\oracle\x64\bin auf die Umgebungsvariable Path permanent und das funktioniert gut.

$ENV:PATH

Der erste Weg ist einfach zu tun:

$ENV:PATH=”$ENV:PATH;c:\path\to\folder”

Aber diese Veränderung ist nicht von Dauer. $env:path wird auf den vorherigen Zustand zurückgesetzt, sobald Sie Ihr PowerShell-Terminal schließen und erneut öffnen. Das liegt daran, dass Sie die Änderung auf der Sitzungsebene und nicht auf der Quellebene (d. h. auf der Registrierungsebene) vorgenommen haben. So zeigen Sie den globalen Wert von $env:path , tun:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH

Oder genauer gesagt:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

Um dies zu ändern, müssen wir zunächst den ursprünglichen Pfad erfassen, der geändert werden muss:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

Jetzt legen wir fest, wie der neue Pfad aussehen soll. In diesem Fall fügen wir einen neuen Ordner hinzu:

$newpath = “$oldpath;c:\path\to\folder”

Hinweis: Stellen Sie sicher, dass die $newpath sieht so aus, wie Sie es wollen. Wenn nicht, könnten Sie Ihr Betriebssystem beschädigen.

Wenden Sie nun den neuen Wert an:

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath

Prüfen Sie nun noch einmal, ob es so aussieht, wie Sie es erwarten:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).Path

Sie können nun Ihr PowerShell-Terminal neu starten (oder sogar den Computer neu starten) und sehen, dass der alte Wert nicht wiederhergestellt wird.

Beachten Sie, dass sich die Reihenfolge der Pfade ändern kann, so dass sie in alphabetischer Reihenfolge stehen. Zur Vereinfachung können Sie die Ausgabe in Zeilen aufteilen, indem Sie das Semikolon als Trennzeichen verwenden:

($env:path).split(“;”)

10voto

JeanT Punkte 1279

Dies legt den Pfad für die aktuelle Sitzung fest und fordert den Benutzer auf, ihn dauerhaft hinzuzufügen:

function Set-Path {
    param([string]$x)
    $Env:Path+= ";" +  $x
    Write-Output $Env:Path
    $write = Read-Host 'Set PATH permanently ? (yes|no)'
    if ($write -eq "yes")
    {
        [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
        Write-Output 'PATH updated'
    }
}

Sie können diese Funktion zu Ihrem Standardprofil hinzufügen, ( Microsoft.PowerShell_profile.ps1 ), normalerweise unter %USERPROFILE%\Documents\WindowsPowerShell .

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