Wie füge ich die Windows PATH-Variable mit setx hinzu? Seltsame Probleme haben

78

Ich möchte die Windows PATH-Variable mit ändern setx. Folgendes funktioniert unter Windows 8 mindestens 50% der Zeit:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

Wenn der Fehler "Das Standardargument kann nur zweimal verwendet werden" angezeigt wird, funktioniert das Folgende manchmal:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

Der Unterschied besteht darin, dass wir das zweite Argument in Anführungszeichen gesetzt haben. Ich glaube, die Anführungszeichen sind notwendig, wenn %PATH%sie um Leerzeichen erweitert werden.

Unter Windows 7 sind jedoch einige seltsame Probleme aufgetreten. Auf einem bestimmten Windows 7-Computer hatte ich dieses Problem:

echo %PATH%

Es druckt:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

Dann mache ich das:

setx PATH "%PATH%;C:\Quux\"

Dann heißt es "Fehler: Bei 1.024 Zeichen abgeschnitten." Lassen Sie uns nun überprüfen, was PATH enthält:

echo %PATH%

Es druckt:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

... und es ist bei 1.024 Zeichen abgeschnitten. Es lief wegen der Duplikate über. Ebenfalls interessant: Der Wert von PATH ändert sich trotz der Tatsache, dass setxein Fehler aufgetreten ist und nicht "Erfolg" gesagt wurde.

Ich konnte dieses seltsame Verhalten mehrmals wiederholen (zum Glück hatte ich den ursprünglichen Inhalt von PATH gespeichert).

Im Moment ist der einzige todsichere Weg, den PATH anzuhängen, der folgende:

  1. echo der Weg.

  2. Kopieren Sie den Inhalt von PATH in eine Textdatei und fügen Sie ihn manuell ;C:\Python27\;C:\Python27\Scripts\am Ende des PATH hinzu.

  3. Kopieren Sie das Ganze aus der Textdatei.

  4. setx PATH "<paste the string here>"

Dieser Vorgang funktioniert jedes Mal unter Windows 7 und Windows 8.

Ich sollte das wirklich in einem Befehl tun können. Was mache ich falsch?

Vielen Dank.

SerMetAla
quelle
10
Die Verwendung setxist aus einem anderen Grund gefährlich: Wenn der Pfad Umgebungsvariablen enthält, z. B. geht %JAVADIR%\bindie Referenz verloren, dh wenn sich JAVADIR ändert, ändert sich der Pfad nicht mehr mit. Wenn es sich um ein Software-Installationsprogramm handelt, können die Computer der Endbenutzer beschädigt werden. Keine gute Idee.
Harry Johnston
1
@ HarryJohnston, Dies ist beabsichtigt. Wann immer Sie a tun %, interpretiert es es an Ort und Stelle .
Pacerier
2
@Pacerier, alle Umgebungsvariablenreferenzen in den Registrierungseinträgen für den Pfad wurden bereits erweitert. Dies geschieht, wenn der Umgebungsblock erstellt wird. Also , wenn Sie füttern %PATH%in setxIhnen diese Informationen zu verlieren. Außerdem wird die Systempfadeinstellung auf die Art und Weise, wie das OP dies tut, zur Benutzerpfadeinstellung hinzugefügt. Bei erneuter Betrachtung der Frage scheint dies die eigentliche Ursache für das OP-Problem zu sein.
Harry Johnston
2
@ HarryJohnston, Es gibt 4 Arten von env-Variablen: hkcu reg_sz, hkcu reg_expand_sz, hklm reg_sz, hklm reg_expand_sz. (Sie können sie manuell mit regedit optimieren und ausführen setx, um den Flush abzuschließen .) ~~~ Beide setxund setx/mstandardmäßig reg_sz, wenn Ihre Eingabe 2+ Zeichen enthält %. ~~~ "expand" in hklm und hkcu bedeutet expand to hklm. setx/m qwe %JAVADIR%\binund setx/m javadir asdfgin beliebiger Reihenfolge. Öffnen Sie dann ein neues cmd und tun Sie echo %qwe%: Funktioniert wie erwartet.
Pacerier
3
@ Pacerier, ich sehe die Relevanz nicht. Der Wert von PATH ist bereits erweitert und enthält sowohl die HKCU- als auch die HKLM-Einträge (letzteres ist ein Sonderfall, der für keine andere Umgebungsvariable %JAVADIR%\binauftritt ). Wenn also der Pfad in HKLM ursprünglich enthalten war und der Pfad ursprünglich in HKCU enthalten wird %JDK%\bindann PATHauf so gesetzt, C:\Java\bin;C:\jdk\binwenn Sie sagen, dass sich setx PATH %PATH%der Wert in HKCU ändert, zu C:\Java\bin;C:\jdk\bindem (a) einen redundanten Eintrag enthält und (b) Änderungen am Wert von JDK nicht mehr verfolgt.
Harry Johnston

Antworten:

75

Führen Sie dann cmdals Administrator aus:

setx /M PATH "%PATH%;<your-new-path>"

Die Option / M legt die Variable im Bereich SYSTEM fest. Das Standardverhalten besteht darin, es für den USER festzulegen.

TL; DR

Das Kürzungsproblem tritt auf, weil beim Echo von% PATH% die Verkettung von SYSTEM- und USER-Werten angezeigt wird. Wenn Sie es also in Ihrem zweiten Argument zu setx hinzufügen, werden SYSTEM- und USER-Werte in die USER-Variable eingefügt. Wenn Sie erneut ein Echo hören, werden die Dinge verdoppelt.

Darüber hinaus erfordert die Option / M Administratorrechte, sodass Sie Ihr Terminal mit "Als Administrator ausführen" öffnen müssen. Andernfalls beschwert sich setx mit "Zugriff auf Registrierungspfad verweigert".

Letzte Anmerkung: Sie sehen den neuen Wert nicht, wenn Sie% PATH% cmdwiederholen, nachdem Sie ihn auf diese Weise eingestellt haben. Sie müssen ihn schließen und wieder öffnen.

Wenn Sie die in der Registrierung gespeicherten tatsächlichen Werte überprüfen möchten, überprüfen Sie diese Frage .

Vituel
quelle
25
Diese Lösung ist falsch. Durch Ausführen des obigen Befehls wird Ihr PathTyp von REG_EXPAND_SZin geändert REG_SZ. Entfernen Sie dabei alle dort vorhandenen Umgebungsvariablenreferenzen.
user2023370
@garyM Danke für das Feedback. Ich habe die genannten Konsequenzen in meinem Fall nicht erlebt / bemerkt. Bitte lassen Sie uns wissen, ob es eine Möglichkeit gibt, diese Antwort zu ändern, um das Problem zu beheben. Oder wenn Sie eine andere Antwort vorschlagen.
Vituel
2
Hi Vituel ,, Das Problem tritt auf, wenn die Variable neu erstellt und später im selben Prozess geändert wird. Die neu erstellte Variable wird in der vorhandenen Shell-Umgebung nicht angezeigt. Jede Referenz behandelt die Referenz% var% als Textzeichenfolge. Um dieses Problem zu vermeiden, muss der Zugriff auf die Variable in einem neuen Prozess ausgeführt werden, der nach dem Erstellen der Variablen erstellt wird. Die Pfadvariable ist in einigen Windows-Versionen ein Sonderfall. In 2008R2 wird die Änderung der PATH-Variablen nicht auf vorhandene Prozesse übertragen, sondern muss erneut instanziiert werden, um die Änderungen zu erhalten. Basierend auf dem Betriebssystem ist / M am Ende.
GaryM
2
Dies führt auch dazu, dass die Benutzer-PATH-Variable an den Maschinen-PATH angehängt wird, was (a) andere Benutzer stört; und (b) bei wiederholtem Ausführen die Länge des Pfades weiter erhöhen, bis er schließlich überläuft. Meistens gibt es keine Benutzereinstellung für PATH, damit Sie damit durchkommen können, aber es ist gefährlich.
Harry Johnston
3
VERWENDEN SIE DIESES NICHT. setxschneidet PATH auf 1024 Zeichen ab. Wenn PATH zuvor geändert wurde, indem mehr Verzeichnisse vorangestellt wurden, verlieren Sie den größten Teil des ursprünglichen PATH-Inhalts !
e.tadeu
22

Das funktioniert perfekt:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

Der erste Befehl ruft die USER-Umgebungsvariable 'PATH' in die Variable 'my_user_path' ab. In der zweiten Zeile wird das 'C: \ Python27; C: \ Python27 \ Scripts;' vorangestellt. auf die USER-Umgebungsvariable 'PATH'

Manohar Reddy Poreddy
quelle
2
Diese Antwort ist imo logisch korrekt. Warum erhielt diese Antwort weder mehr Stimmen noch wurde sie angenommen? Habe ich etwas vergessen ?
Siva Sankaran
Coz stackoverflow (SO) nimmt das Feedback seiner Benutzer nicht entgegen :-). Wenn jemand davon spricht, dass eine Antwort logisch ist, sollte dies eine Art feststeckbare Antwort sein, wie in Quora. Leser wie Sie sollten in der Lage sein, die guten Antworten festzunageln. SO ist gut, ändert sich aber leider nicht mit der Zeit. Wir können es nicht einmal so markieren, @stackoverflow, niemand, der zuhört.
Manohar Reddy Poreddy
2
@AMVaddictionist - Ich denke, %% oder% haben damit zu tun, wenn Sie es als .bat-Datei oder direkt im cmd ausführen. Hoffentlich hilft das.
Manohar Reddy Poreddy
2
Zustimmen. Dies ist die richtige Antwort. Wie geschrieben, dient es zur Ausführung an einer Eingabeaufforderung, und das einzelne% muss durch das doppelte %% ersetzt werden, um in einer Batchdatei ausgeführt zu werden.
JonathanDavidArndt
1
@mozilla_firefox - ja, wir machen Backups und probieren dann etwas Neues aus :), sind wir richtige Entwickler? : D
Manohar Reddy Poreddy
5

Wenn jemand es in PowerShell ausführen möchte, funktioniert es wie folgt:

Führen Sie Powershell als Administrator aus

Dann

setx /M PATH "$Env:PATH;<path to add>"

Öffnen Sie zur Überprüfung eine weitere Powershell und zeigen Sie PATH wie folgt an:

$Env:PATH
NIK
quelle
4

Wenn Sie nicht dazu verpflichtet sind setx, können Sie ein alternatives Befehlszeilentool wie pathed verwenden . Eine umfassendere Liste alternativer PATH-Editoren finden Sie unter /superuser/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712

Sie können den Registrierungswert auch direkt bearbeiten setx. Mehr in dieser Antwort .

Es ist seltsam, dass Ihr %PATH%Zeichen bei 1024 Zeichen abgeschnitten wird. Ich dachte, ich setxhätte dieses Problem nicht. Obwohl Sie wahrscheinlich die ungültigen Pfadeinträge bereinigen sollten.

Ehtesh Choudhury
quelle
5
Vielen Dank für die Vorschläge, aber ich möchte mich wirklich nicht auf Software von Drittanbietern verlassen. Ich möchte nur Dinge verwenden, die mit Windows kommen. Dies liegt daran, dass ich zwei Hauptanwendungsfälle habe: (1) Einrichten von Neulingen, die Python lernen möchten, und (2) Einrichten von Maschinen, die in der Fabrik meines Unternehmens verwendet werden. In beiden Fällen handelt es sich um einen zufälligen Windows-Computer, auf dem der Pfad nur einmal bearbeitet wird. Ich möchte die Bearbeitung von PATH so einfach wie möglich gestalten, und die Installation von mehr Software macht es wirklich nicht möglich. Deshalb ist selbst meine 4-Stufen-Problemumgehung nicht gut genug.
SerMetAla
Die Tools, die ich verlinkt habe, haben tragbare Binärdateien, die Sie in einer Zip-Datei bündeln können. Sie können die Benutzer dazu bringen, etwas so Einfaches wie das Ausführen einer .batDatei zu tun und die PATHBearbeitung sowie das Einrichten von Python-Code zu übernehmen.
Ehtesh Choudhury
4

Ohne Administratorrechte hat für mich nur eine Bat-Datei funktioniert, die den folgenden Code enthält:

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

Der Code ist die Kombination der Antworten https://stackoverflow.com/a/45566845/4717152 und https://stackoverflow.com/a/10292113/4717152

Andreas M. Oberheim
quelle
Wenn Sie möchten, dass dieser Teil des Pfads Änderungen an% USERPROFILE% folgt, können Sie double %%in einer bat-Datei verwenden (oder ^%wenn Sie den Befehl direkt ausführen - sehen Sie, wie Sie in bat vs cmd entkommen ).
TamaMcGlinn
3

Ich hatte die gleichen Probleme und fand jetzt eine einfache Lösung.

Pathman verwenden.

pathman /as %M2%

Fügt dem Systempfad beispielsweise% M2% hinzu. Nicht mehr und nicht weniger. Keine Probleme mehr beim Abrufen einer Mischung aus Benutzerpfad und Systempfad. Kein Versuch mehr, die richtigen Werte aus der Registrierung zu erhalten ...

Versucht bei Windows 10

Markus
quelle
pathmanmacht den Job einwandfrei. Sollte abwärtskompatibel mit Windows 2003 Resource Kit sein
Pat Migliaccio
@PatMigliaccio Ihr Link ist tot
TamaMcGlinn
2
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

Dies sollte das Anhängen an den Pfad der Systemumgebungsvariablen ohne zusätzliche Extras und das intakte Original ohne Datenverlust durchführen. Ich habe diesen Befehl verwendet, um das Problem zu beheben, das McAfees Web Control mit dem Outlook-Desktop-Client von Microsoft verursacht.

Die Anführungszeichen werden im Pfadwert verwendet, da die Befehlszeile Leerzeichen als Trennzeichen sieht und versucht, den nächsten Wert in der Befehlszeile auszuführen. Die Anführungszeichen überschreiben dieses Verhalten und behandeln alles in den Anführungszeichen als Zeichenfolge.

Drunk_Kremlin
quelle
0

Schritte: 1. Öffnen Sie eine Eingabeaufforderung mit Administratorrechten.

Schritte: 2. Führen Sie den folgenden Befehl aus: setx / M PATH "path \ to;% PATH%"

[Hinweis: Ändern Sie den Befehl so, dass path \ to den Ordnerpfad von Ihrem Stammverzeichnis widerspiegelt.]

Beispiel : setx / M PATH "C: \ Programme;% PATH%"

Raj Tukadiya
quelle
4
OP hat mehrere Details und Beobachtungen für sein Problem beschrieben. OP hat mehrere Versuche beschrieben, sein Problem zu lösen. Einige von ihnen sind Ihrem Vorschlag ziemlich ähnlich. Können Sie die relevanten Unterschiede hervorheben und erklären, wie sie das OP-Problem lösen?
Yunnosch
0

Ich hatte solche Probleme bei der Verwaltung meiner Computerlabore, als sich die Umgebungsvariable% PATH% 1024 Zeichen näherte, dass ich ein Powershell-Skript schrieb, um das Problem zu beheben.

Sie können den Code hier herunterladen: https://gallery.technet.microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

Sie können es auch als einfache Möglichkeit verwenden, PATH-Einträge sicher hinzuzufügen, zu entfernen und zu analysieren. Genießen.

Carl Bennett
quelle
0

Leider können Sie mit OOTB-Tools weder den Systempfad noch den Benutzerpfad direkt / einfach anhängen. Wenn Sie bei den OOTB-Tools bleiben möchten, müssen Sie entweder den SYSTEM- oder den USER-Pfad abfragen, diesen Wert als Variable speichern, dann Ihre Ergänzungen anhängen und mit setx speichern. Die beiden folgenden Beispiele zeigen, wie Sie beide abrufen, speichern und Ihre Ergänzungen anhängen können. Verwirren Sie sich nicht mit% PATH%, es ist eine Verkettung von USER + SYSTEM und führt zu vielen Überschneidungen im Ergebnis. Sie müssen sie wie unten gezeigt aufteilen ...

An Systempfad anhängen

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

An Benutzerpfad anhängen

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B

setx PATH "%userPATH%;C:\path3;C:\path4"
Inetquestion
quelle
0

Dieser vbscript / Batch-Hybrid "append_sys_path.vbs" ist nicht intuitiv, funktioniert aber perfekt:

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

Vorteile dieses Ansatzes:

1) Die Systempfadumgebung wird bei 1024 Zeichen nicht abgeschnitten.
2) Die System- und Benutzerpfadumgebung wird nicht verkettet.
3) Es wird automatisch als Administrator ausgeführt.
4) Behalten Sie die Prozentsätze in der Systempfadumgebung bei.
5) Unterstützt Leerzeichen, Klammern und Sonderzeichen.
6) Funktioniert unter Windows 7 und höher.

Riccardo La Marca
quelle