Ich habe versucht, zu optimieren SBF's y Michael's Code etwas zu kompakt zu gestalten.
Ich verlasse mich auf die PowerShell-Typ-Coercion, bei der Zeichenketten automatisch in Enum-Werte konvertiert werden, daher habe ich das Nachschlagewörterbuch nicht definiert.
Ich habe auch den Block herausgenommen, der den neuen Pfad auf der Grundlage einer Bedingung zur Liste hinzufügt, so dass die Arbeit einmal erledigt und in einer Variablen zur Wiederverwendung gespeichert ist.
Es wird dann dauerhaft 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 von der Befehlszeile aus aufrufen. Ich habe mich für DevEnvAddPath.ps1 entschieden.
param(
[Parameter(Position=0,Mandatory=$true)][String]$PathChange,
[ValidateSet('Machine', 'User', 'Session')]
[Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
[Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)
[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';
if ($PathPersisted -notcontains $PathChange) {
$PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };
$ConstructedEnvPath = $PathPersisted -join ";";
}
if ($PathContainer -ne 'Session')
{
# Save permanently to Machine, User
[Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}
# Update the current session
${env:Path} = $ConstructedEnvPath;
Ich mache etwas Ähnliches für eine DevEnvRemovePath.ps1.
param(
[Parameter(Position=0,Mandatory=$true)][String]$PathChange,
[ValidateSet('Machine', 'User', 'Session')]
[Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)
[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';
if ($PathPersisted -contains $PathChange) {
$PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };
$ConstructedEnvPath = $PathPersisted -join ";";
}
if ($PathContainer -ne 'Session')
{
# Save permanently to Machine, User
[Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}
# Update the current session
${env:Path} = $ConstructedEnvPath;
Bislang scheinen sie zu funktionieren.
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 path4 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