2017-05-28 7 views
3

Lassen Sie uns sagen, das, was PATH mein Windows-System wie folgt aussieht:Entfernen Linien von Windows-Pfadvariablen

C: \ oracle \ product \ 11.2.0 \ 32bit \ client_1 \ bin; C: \ oracle \ product \ 11.2.0 \ 64bit \ Client_1 \ bin; C: \ WINDOWS \ system32; C: \ WINDOWS; C: \ WINDOWS \ System32 \ Wbem; C: \ WINDOWS \ System32 \ Windows \ v1.0 \

Wie würde ich diesen ersten Eintrag entfernen und ihn am Ende der Liste hinzufügen? Ich weiß, dass Sie setx dafür verwenden können, aber ich würde das lieber mit PowerShell machen.

+0

Kennen Sie den Namen der Variablen, die die PATH-Zeichenfolge in Powershell hält? Warum nicht eine Schleife machen, um jedes Zeichen der Zeichenkette zu erhalten und es in $ buffer1 zu kopieren, bis es zum ersten '" "kommt. Danach hör auf, die Zeichen nach $ buffer1 zu kopieren und fange an, sie nach $ buffer2 zu kopieren (also $ buffer2 + = $ char). Nachdem die Schleife abgeschlossen ist, setzen Sie einfach PATH auf $ buffer2 + $ buffer1 – flen

Antwort

5
# Split the existing path into the 1st entry and the rest. 
$first, $rest = $env:Path -split ';' 

# Rebuild the path with the first entry appended. 
$env:Path = ($rest + $first) -join ';' 

# To make this change persistent for the current user, 
# an extra step is needed: 
[Environment]::SetEnvironmentVariable('Path', $env:Path, 'User') 
+0

Danke, das ist, was ich gesucht habe! Ich hatte einige Beispiele anderer Dinge mit dem Befehl -split gesehen, war mir aber nicht sicher, ob dies die beste Lösung hier wäre oder wie man sie anwendet. – Chris

+0

@ Chris; Gern geschehen; '-split',' -join' und '-replace' sind mächtige Biester - es lohnt sich, sie in PowerShell kennenzulernen. – mklement0

-1

Ich bin nicht mit PowerShell-Skripts vertraut, aber ich glaube, dass Sie C# darin schreiben können. Wenn das so ist, hilft vielleicht die C#.

Beachten Sie, dass drei PATH-Umgebungsvariablen zur Auswahl stehen: die für den Prozess angegebene, die für den Benutzer angegebene und die für die Maschine selbst vergebene. Für den Demo-Code unten wählte ich den für den Prozess.

var whichPath = EnvironmentVariableTarget.Process; 

string path = Environment.GetEnvironmentVariable("PATH", whichPath); 

string [] pathEntries = path.Split(';'); 

if (pathEntries.Length > 1) 
{ 
    // Initialize to the necessary length, for efficiency. 
    var sb = new StringBuilder(capacity: path.Length); 
    for(int i = 1; i < pathEntries.Length; ++i) 
    { 
     sb.Append(pathEntries[i]).Append(';'); 
    } 
    sb.Append(pathEntries[0]).Append(';'); 

    Environment.SetEnvironmentVariable("PATH", sb.ToString(), target: whichPath); 
} 
+1

Ja, es gibt Möglichkeiten, C# -Code bei Bedarf in PowerShell zu kompilieren (siehe [Add-Type] (https://msdn.microsoft.com/en-us) /powershell/reference/5.1/microsoft.powershell.utility/add-type)), aber der Hauptgrund dafür ist die Leistung (für _repeated_ tasks, weil Sie für die Erstkompilierung eine Leistungseinbuße zahlen müssen). Der vorliegende Fall ruft C# definitiv nicht auf, da PowerShell die Arbeit sehr viel präziser erledigen kann, da er (im Allgemeinen) auf einer höheren Abstraktionsebene arbeitet. – mklement0

0

Eine schnelle und einfache Art und Weise:

$values = 'C:\oracle\product\11.2.0\32bit\client_1\bin;C:\oracle\product\11.2.0\64bit\client_1\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WIN DOWS\System32\WindowsPowerShell\v1.0\' -split ';'         #' 

$result = $values[$values.Count-1] + ';' 
for($i = 1; $i -lt $values.Count-1; $i++){ $result += $values[$i] + ';' } 
$result += $values[0] 

$result 
+0

Danke. Der Highlighter kann leider nicht mit '\ 'umgehen, was er als _escaped_' '' interpretiert. Die Problemumgehung besteht darin, das "fehlende" Schließen von "" in einem (Off-Screen-) Kommentar bereitzustellen, was ich gerade für Ihre Antwort getan habe. – mklement0

+0

Danke, aber auf meinem Handy ist # sichtbar. Es scheint wie ein Fehler in der Post-Darstellung auf mobilen Geräten. – k7s5a

+0

Vielen Dank, dass Sie mich wissen lassen - es ist ein unvollkommener Workaround; Sie können den Kommentar auch auf der Desktop-Seite sichtbar machen, indem Sie horizontales Scrollen verwenden, aber es macht zumindest keinen Schaden (der Code funktioniert immer noch). – mklement0

Verwandte Themen