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

9voto

SBF Punkte 990

Aufbauend auf @Michael Kropat's Antwort fügte ich einen Parameter hinzu, um den neuen Pfad dem bestehenden Pfad voranzustellen PATH und eine Prüfung, um zu verhindern, dass ein nicht vorhandener Pfad hinzugefügt wird:

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

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

        [Parameter(Mandatory=$False)]
        [Switch] $Prepend
    )

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

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

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

8voto

YorSubs Punkte 2118

Nur die Antworten, die den Wert in die Registrierung übertragen, wirken sich auf eine dauerhaft ändern (so dass die Mehrheit der Antworten in diesem Thread, einschließlich der akzeptierten Antwort, eine pas dauerhaft auf die Path ).

Die folgende Funktion funktioniert für beide Path / PSModulePath und für User / System Typen. Außerdem wird der neue Pfad standardmäßig zur aktuellen Sitzung hinzugefügt.

function AddTo-Path {
    param ( 
        [string]$PathToAdd,
        [Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
        [Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
    )

    # AddTo-Path "C:\XXX" "PSModulePath" 'System' 
    if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
    if ($UserType -eq "User"   ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
    $PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
    "`n$UserType $PathType Before:`n$PathOld`n"
    $PathArray = $PathOld -Split ";" -replace "\\+$", ""
    if ($PathArray -notcontains $PathToAdd) {
        "$UserType $PathType Now:"   # ; sleep -Milliseconds 100   # Might need pause to prevent text being after Path output(!)
        $PathNew = "$PathOld;$PathToAdd"
        Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
        Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
        if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" }                  # Add to Path also for this current session
        if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" }  # Add to PSModulePath also for this current session
        "`n$PathToAdd has been added to the $UserType $PathType"
    }
    else {
        "'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
    }
}

# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"

# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"

7voto

Paul Maurer Punkte 300

Innerhalb von PowerShell kann man zum Verzeichnis der Umgebungsvariablen navigieren, indem man eingibt:

Set-Location Env:

Dadurch gelangen Sie in das Verzeichnis Env:>. Innerhalb dieses Verzeichnisses:

Um alle Umgebungsvariablen zu sehen, geben Sie ein:

Env:\> Get-ChildItem

Um eine bestimmte Umgebungsvariable anzuzeigen, geben Sie ein:

Env:\> $Env:<variable name>, e.g. $Env:Path

Um eine Umgebungsvariable zu setzen, geben Sie ein:

Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"

Um eine Umgebungsvariable zu entfernen, geben Sie ein:

Env:\> remove-item Env:<variable name>, e.g. remove-item Env:SECRET_KEY

Weitere Informationen finden Sie unter _Über Umgebungsvariablen_ .

6voto

Mehrdad Mirreza Punkte 844

Como Jonathan Leaders erwähnt ici ist es wichtig, den Befehl/das Skript in erhöhter Position auszuführen, um die Umgebungsvariablen für Maschine , aber die Ausführung einiger Befehle in erhöhter Position muss nicht mit den Community Extensions erfolgen, daher würde ich gerne die JeanT's Antwort in einer Weise, dass die Änderung von Maschinenvariablen auch dann durchgeführt werden kann, wenn das Skript selbst nicht erhöht ausgeführt wird:

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
    $Env:Path += ";$newPath"

    $scope = if ($forMachine) { 'Machine' } else { 'User' }

    if ($permanent)
    {
        $command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
        Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
    }

}

5voto

Jonathan Punkte 5990

Die meisten Antworten befassen sich nicht mit UAC . Dies betrifft UAC-Probleme.

Installieren Sie zunächst die PowerShell Community Extensions: choco install pscx über http://chocolatey.org/ (möglicherweise müssen Sie Ihre Shell-Umgebung neu starten).

Dann pscx aktivieren

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

Dann verwenden Sie Invoke-Elevated

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR

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