Wie kann ich einen Eintrag über die Befehlszeile dauerhaft an die PATH-Variable des Systems anhängen?

13

Was ich tun muss:

  • Hängen Sie einen Ordner an die %PATH%Umgebungsvariable auf SYSTEM-Ebene an.
  • Machen Sie die Änderung dauerhaft.

Wie ich es machen muss:

  • Verwenden der Eingabeaufforderung oder einer anderen Methode, mit der alle erforderlichen Befehle in eine .BATDatei geschrieben werden können .
  • Verwenden Sie nur Tools, die für eine reine Installation von Windows XP SP3 ohne Internetverbindung verfügbar wären.
  • Ich möchte das Skript lieber lokal ausführen, habe aber auch Remote-Zugriff auf die Zielsysteme. Beachten Sie jedoch, dass ich nicht davon ausgehen kann, dass nicht standardmäßige Dienste (z. B. Remote Registry) auf den Systemen aktiviert sind.

Systeme, auf denen das Skript arbeiten muss:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Ich bin mit dem SETBefehl ziemlich vertraut , aber mir ist auch bewusst, dass er im Allgemeinen die vorhandene Variable überschreibt , anstatt an sie anzuhängen. Das ist nicht akzeptabel. Gibt es ein anderes Tool (oder eine andere Option SET, die mir nicht bekannt ist), das stattdessen an die Variable angehängt wird? Oder muss ich eine Problemumgehung in das Skript einfügen, bei der die vorhandene Variable vorübergehend in eine andere Variable oder Textdatei kopiert wird?

Nach meinem Verständnis SETwird die Variable auch nicht dauerhaft geändert. Ich habe die Erwähnung von gesehen SETX, aber das scheint nicht in Windows XP SP3 integriert zu sein (oder zumindest scheint es auf dem System, an dem ich arbeite, nicht verfügbar zu sein). Gibt es eine andere Möglichkeit, die Änderung dauerhaft zu machen, über die Registrierungsbearbeitung oder so?

Ich habe mich ein wenig umgesehen und von hier aus einiges über das Festlegen von Umgebungsvariablen in Windows gelernt. Ich habe jedoch noch keine exakte doppelte Frage gefunden, die meinen Anforderungen entspricht. Wenn es eine gibt, lass es mich bitte wissen.

Iszi
quelle
Setx kommt nicht mit XP. Es ist in einem oder mehreren Resource Kits enthalten, aber ich vergesse sofort, welches. Es ist definitiv der einfachste Weg, permanente Änderungen an Umgebungsvariablen in der Befehlszeile vorzunehmen. Sie können die Änderung in der Registrierung vornehmen (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment), aber auch Registrierungsänderungen über die Befehlszeile sind kein Kinderspiel. Wenn ich Sie wäre, würde ich ein VBScript schreiben, um dies zu tun.
EBGreen
@EBGreen Ich bin ein bisschen vertraut damit REG, Registrierungsänderungen vorzunehmen. Wenn Sie dies als Antwort mit Vorschlägen zur Beibehaltung des bestehenden Pfades posten möchten, würde ich zumindest dafür stimmen.
Iszi
1
Ich denke, gemäß dem Vorschlag von EBGreen habe ich herausgefunden, wie ich es tun muss. Ich wünschte nur, es gäbe eine Möglichkeit, die Aktualisierung der Registrierung zu erzwingen (und auf Umgebungsvariablen zu verschieben), ohne den Explorer neu zu starten oder neu zu laden.
Iszi
1
@EBGreen Ja, so sieht es aus. Übrigens, wenn Sie etwas Zeit haben, die Syntax herauszufinden, können Sie bitte eine tatsächliche Antwort posten? Es wäre mir lieber, wenn dies nicht zu einer selbst beantworteten Frage würde.
Iszi
1
@lszi, du solltest deine eigene Frage beantworten. Eine gute Antwort auf eine gute Frage ist beides wertvoll, auch wenn Sie sie selbst beantworten.
Myrddin Emrys

Antworten:

4

Der folgende Befehl fügt Ihrem Pfad "C: \ bin" hinzu und speichert den neuen Pfad in der Registrierung:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

Ich habe dies nur auf XP SP3 getestet, aber es sollte auch auf einer neueren Version funktionieren.

Ich vermute, ein neuer Benutzer, der sich anmeldet, bevor der Computer neu gestartet wird, erhält möglicherweise nicht den neuen Pfad.

Harry hat Recht mit seinem Kommentar zu% SystemRoot%. Wenn Sie diese behalten möchten, müssen Sie zuerst den alten Wert für path aus der Registrierung ziehen:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
Peter Hahndorf
quelle
2
Beachten Sie, dass hierdurch einige der vorhandenen PATH-Einträge geändert werden, indem die Verweise auf Umgebungsvariablen erweitert werden. Beispielsweise wird der Standardeintrag% SystemRoot% \ system32 durch c: \ windows \ system32 ersetzt. Dieses spezielle Beispiel spielt keine Rolle, da SystemRoot eine Konstante ist. Wenn jedoch jemand einen PATH mit einem Verweis auf eine Umgebungsvariable eingerichtet hat, die sich ändert, wird dieser beschädigt. (Ich mache dies auf einigen meiner Computer, um auf das bin-Verzeichnis im aktuellen Sun JDK zu verweisen.)
Harry Johnston,
Das neue Skript funktioniert nicht wie geschrieben, wenn der Pfad eckige Klammern enthält, z. B. Verweise auf Programme (x86).
Harry Johnston
-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f
anon
quelle
2
Während nackte Befehle nützlich sein können, erwarten wir ein wenig mehr Arbeit in unseren Fragen / Antworten. Bitte erläutern Sie, wie dies die Frage des OP beantwortet.
Donnerstag,