Batch - Ändern der Umgebungsvariable PATH
Hallo,
ich möchte mit Hilfe eines Batch Skriptes einen Pfad zur Umgebungsvariablen PATH hinzufügen. Dabei sollte geprüft werden, ob dieser Pfad schon enthalten ist. Das ganze soll mit Windows XP SP2 Boardmitteln realisiert und dann als GPO-Startskript ausgeführt werden.
Folgende Ideen habe ich ausprobiert:
Methode 1
1. Auslesen von PATH aus der Registry ("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" - Path - REG_EXPAND_SZ) mittels reg.exe QUERY:
2. Konkatenieren des Inhaltes von x mit dem hinzuzufügenden Pfad:
3. Zurückschreiben der Variablen in die Registry:
Probleme
Beispiel: PATH= C:\Mein\tolles Programm;C:\mein\Programm
Ergebnis von reg query: C:\Mein\tolles
-> Das Leerzeichen im Pfad fungiert anscheinend als Trennzeichen. Ich weiß leider nicht, wie ich das umgehen kann.
-> Auch weiß ich nicht, wenn ich die Pfade dann korrekt in %x% stehen hätte, wie ich darin suchen könnte, ob der hinzuzufügende Pfad schon enthalten ist. Dann soll der Pfad natürlich nicht hinzugefügt werden.
Methode 2
1. Benutzen der Umgebungsvariablen %PATH% direkt.
2. Rest wie oben.
Probleme
-> Auch hier weiß ich nicht, wie ich filtern kann, ob der Pfad schon enthalten ist.
-> Außerdem wird bei zurückschreiben der Variablen in die Registry der PATH falsch geändert. Dort steht dann sinngemäß: \\domänencontroller\...sysvol\..policies\...\speicherort des Startskriptes. Ich weiß wohl, was das für ein Ort ist (An diesem Ort liegt das Startskript in der GPO). Ich weiß aber nicht, warum dies geschieht
Ich würde mich freuen, wenn mir hier jemand unter die Arme greifen könnte. Auch über ganz neue Vorschläge für Lösungswege würde ich mich freuen. Nichts desto trotz interessiert mich auch, wie ich zumindest das Auslesen aus der Reg. korrekt hinbekommen würde, sodass das Leerzeichen kein Problem mehr darstellt. Und wie man korrekt aus dem ganzen Stringkram filter und daraus dann mittels if Abfrage entscheiden kann, ob der Pfad schon vorhanden ist oder nicht.
Vielen Dank für eure Hilfe!
ich möchte mit Hilfe eines Batch Skriptes einen Pfad zur Umgebungsvariablen PATH hinzufügen. Dabei sollte geprüft werden, ob dieser Pfad schon enthalten ist. Das ganze soll mit Windows XP SP2 Boardmitteln realisiert und dann als GPO-Startskript ausgeführt werden.
Folgende Ideen habe ich ausprobiert:
Methode 1
1. Auslesen von PATH aus der Registry ("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" - Path - REG_EXPAND_SZ) mittels reg.exe QUERY:
@for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set x=%%i
@echo %x%
set neu=%x%;MeinPfad
@REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%neu%" /f
Probleme
Beispiel: PATH= C:\Mein\tolles Programm;C:\mein\Programm
Ergebnis von reg query: C:\Mein\tolles
-> Das Leerzeichen im Pfad fungiert anscheinend als Trennzeichen. Ich weiß leider nicht, wie ich das umgehen kann.
-> Auch weiß ich nicht, wenn ich die Pfade dann korrekt in %x% stehen hätte, wie ich darin suchen könnte, ob der hinzuzufügende Pfad schon enthalten ist. Dann soll der Pfad natürlich nicht hinzugefügt werden.
Methode 2
1. Benutzen der Umgebungsvariablen %PATH% direkt.
2. Rest wie oben.
Probleme
-> Auch hier weiß ich nicht, wie ich filtern kann, ob der Pfad schon enthalten ist.
-> Außerdem wird bei zurückschreiben der Variablen in die Registry der PATH falsch geändert. Dort steht dann sinngemäß: \\domänencontroller\...sysvol\..policies\...\speicherort des Startskriptes. Ich weiß wohl, was das für ein Ort ist (An diesem Ort liegt das Startskript in der GPO). Ich weiß aber nicht, warum dies geschieht
Ich würde mich freuen, wenn mir hier jemand unter die Arme greifen könnte. Auch über ganz neue Vorschläge für Lösungswege würde ich mich freuen. Nichts desto trotz interessiert mich auch, wie ich zumindest das Auslesen aus der Reg. korrekt hinbekommen würde, sodass das Leerzeichen kein Problem mehr darstellt. Und wie man korrekt aus dem ganzen Stringkram filter und daraus dann mittels if Abfrage entscheiden kann, ob der Pfad schon vorhanden ist oder nicht.
Vielen Dank für eure Hilfe!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 116473
Url: https://administrator.de/contentid/116473
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
26 Kommentare
Neuester Kommentar
geht so:
set path="X:\Mein neuer Pfad";%path%
Es stört auch nicht, wenn der Pfad bereits vorhanden war. Direkte Änderungen sind über die Systemsteuerung > Erweitert > Umgebungsvariablen auch möglich.
Änderungen über die Registry erfordern Neuanmeldung/Neustart, bevor sie wirksam sind. Das Auslesen ist nach meinem Meinung auch überflüssig, da die Umgebungsvariable Path bereits Auskunft über den Inhalt gibt.
Wenn du das aber trotzdem über die Registry lösen willst, musst du auch den Userteil der Umgebungsvariablen beachten;
HKEY_CURRENT_USER\Environment
Du kannst aber zum direkten Ändern SETX aus dem Ressource-Kit verwenden.
Hallo Viprex,
meine Behelfslösung sieht so aus:
Gruß
LotPings
meine Behelfslösung sieht so aus:
Set NeuerPfad=C:\Irgendwas
For %%A in ("%PAth:;=" "%") do if /i %%A=="%NeuerPfad%" echo Pfad schon enthalten
Gruß
LotPings
Zitat von @Viprex:
> Zitat von @78632:
> Es stört auch nicht, wenn der Pfad bereits vorhanden war.
doch, stört es. Auch mit deinem Code wird der Pfad immer wieder
hinzugefügt. Das kann letztenendes darin resultieren, dass der
Pfad dann X mal drin steht. Das macht zwar erstmal nichts, tut ja aber
nicht not.
> Zitat von @78632:
> Es stört auch nicht, wenn der Pfad bereits vorhanden war.
doch, stört es. Auch mit deinem Code wird der Pfad immer wieder
hinzugefügt. Das kann letztenendes darin resultieren, dass der
Pfad dann X mal drin steht. Das macht zwar erstmal nichts, tut ja aber
nicht not.
Es stört nur, wenn man nach erfolgter Änderung das Script nochmal und immer wieder laufen lässt.
Im HKCU\Enviroment steht ja auch
nicht die PATH Variable drin, sondern nur TEMP und TMP.
Oder habe ich hier einen Denkfehler?
nicht die PATH Variable drin, sondern nur TEMP und TMP.
Oder habe ich hier einen Denkfehler?
Möglicherweise. Der User kann eine eigene Erweiterung für die PATH-Umgebungsvariable eintragen. Die steht dann im Userteil.
Zitat von @Viprex:
Das funktioniert hervorragend! Herzlichen Dank. Damit komme ich der
Problemlösung ein ganzes Stück näher. Magst du mir
vielleicht erklären, was da passiert?
Klar ist mir, dass er %PATH% durchgeht. Was ist aber das Trennzeichen
bei dir? inbesondere den Teil :;=" "% verstehe ich nicht.
Er prüft dann wahrscheinlich im "do Teil" für
jeden gefundenen Pfad, ob es sich um meinen Pfad handelt (if
%%A=="%NeuerPfad%). Ich würde mich freuen, wenn du mir also
den inneren Teil der For Schleife erklären würdest.
Das funktioniert hervorragend! Herzlichen Dank. Damit komme ich der
Problemlösung ein ganzes Stück näher. Magst du mir
vielleicht erklären, was da passiert?
Klar ist mir, dass er %PATH% durchgeht. Was ist aber das Trennzeichen
bei dir? inbesondere den Teil :;=" "% verstehe ich nicht.
Er prüft dann wahrscheinlich im "do Teil" für
jeden gefundenen Pfad, ob es sich um meinen Pfad handelt (if
%%A=="%NeuerPfad%). Ich würde mich freuen, wenn du mir also
den inneren Teil der For Schleife erklären würdest.
Nicht direkt, um das Problem der Leerzeichen zu umgehen kann/muß man Anführungszeichen setzen. Die sollten deshalb auch NIEMALS selbst in den Pfad gesetzt werden.
Hier mal ein exemplarischer SQL Server Teil-Pfad:
Path=c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\
"%Path:;=" "%"
macht ist erstmal außen herum Anführungszeichen zu setzen und zweitens per "Ersetzen von Umgebungsvariablen" siehe in der Hilfe von set /?
alle Semikolon durch " "
auszutauschen.Dieser Inhalt
"c:\Program Files\Microsoft SQL Server\100\Tools\Binn\" "c:\Program Files\Microsoft SQL Server\100\DTS\Binn\"
Hat auch noch jemand die Lösung für mich bzgl. des Auslesens aus der Registry für mich? Warum trennt er bei meinem Code immer beim Leerzeichen in den Pfaden? Ich weiß, das ich das für meine Lösung nicht mehr benötige, aber > interessieren würde es mich schon, wenn es nicht zu viel Aufwand ist.
Kein Problem, es gibt das token * welches alle (restlichen) Elemente umfasst, damit es ab dem dritten token wirkt nimm einfach Dummy Token dazu.Den Buchstaben mußt du natürlich dann erhöhen.
@for /f "tokens=2*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j"
@echo %x%
Gruß
LotPings
Zitat von @Viprex:
Ist der Doppelpunkt die Anweisung zum Ersetzen? Klar das
Im Prinzip schon. HAST DU DIE AUSGABE VON Ist der Doppelpunkt die Anweisung zum Ersetzen? Klar das
;=" "
ausdrückt, dass das Semikolon "gleich" dem Ausdruck " " sein soll.Set /?
GELESEN?Da steht das alles drin.
@for /f "tokens=2*" %%i in ('reg query
"HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j"
@echo %x%
Bedeutet tokens=2* also, dass alles inklusive dem 2. Token genommen wird oder ist das schon der Rest? Warum muss ich dann hochzählen? Steht in %%i dann das Token 2 und in %%j der Rest? Und warum steht dort ein Tilde (~)?
Nein Token 2 kommt in die variable %%i " Das ist dann REG_SZ und hier eben der nicht benötigte Dummy. Alle folgenden Elemente kommen in die nächste Variable %%j.Die Tilde ~ ist in der Hilfe zum For Befehl erklärt. Sie entfernt ggfs in der Variable enthaltene äußere Anführungszeichen. Die würden den Set Befehl sonst unter Umständen aus dem Tritt bringen.
Gruß
LotPings
Edit: i -> j
Hierbei hat sich bei LotPings offenbar ein Flüchtigkeitsfehler eingeschlichen:
Die nächste Variable ist %%j und nicht %%i
Nein Token 2 kommt in die variable %%i " Das ist dann REG_SZ und hier eben der nicht benötigte Dummy. Alle folgenden Elemente
kommen in die nächste Variable %%i.
kommen in die nächste Variable %%i.
Die nächste Variable ist %%j und nicht %%i
Zitat von @Viprex:
Kewl, danke! Ich sollte mich doch noch intensiver mit dem Hilfen beschäftigen. Dort steht ja wirklich allerhand drin.
So ist es.Kewl, danke! Ich sollte mich doch noch intensiver mit dem Hilfen beschäftigen. Dort steht ja wirklich allerhand drin.
Rob van derVoude hat auch eine Batchdatei allhelp.bat geschrieben die diese Hilfen sammelt und in eine HTML-Datei mit Index schreibt. Leider klappt das bei neueren Windows mit teilweiser Unicode-Ausgabe nicht mehr so gut mit der Umlaut-Darstellung.
Gruß
LotPings
Wenn du eine Variable aufrufst, deren eigenen Wert du ändern willst, musst du EnableDelayedExpansion nutzen und im 2 Aufruf statt des %-Zeichens das !-Zeichen verwenden.
Das sollte funktionieren:
Pause kannst du ja dann wegnehmen, wenn du das Ergebnis für gut befindest.
Das sollte funktionieren:
@echo off & setlocal EnableDelayedExpansion
Set AlterPfad=C:\Mein Pfad
Set NeuerPfad=
For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" @set "NeuerPfad=!NeuerPfad!%%~A;"
goto end
:end
echo %NeuerPfad%
pause
Pause kannst du ja dann wegnehmen, wenn du das Ergebnis für gut befindest.
Wenn die möglicherweise doppelten ;; am Ende der neuen Path-Variablen stören sollten, kannst du 1 wegnehmen:
:end
Set NeuerPfad=%NeuerPfad:~0,-1%
Aus reiner Neugierde: Wo liegt der Fehler beim Call und der
Paramterübergabe?
Du übergibst %%A, daraus wird in der Subroutine %1 Paramterübergabe?
Dann hast du meine Änderung nicht vollständig übernommen.
Dein "NeuerPfad" ist am Anfang leer, also wird - so wie du das ursprünglich gelöst hast - zuerst dein ";" gesetzt.
Du kannst das aber durch
:end
Set NeuerPfad=%NeuerPfad:~1%
Logisch. Das Leerzeichen ist ein Parametertrennzeichen. Mit der Tilde in "%%~A" nimmst du die Anführungszeichen ja wieder weg.
Bekomme ich das irgendwie anders hin?
Ja, indem du den Variablenbezeichner mit Anführungszeichen umschließt: "%%A" Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.
Funktioniert doch, wenn du die "" lässt.
Im einfachsten Fall erkennt man Fehler, wenn vor der Ausführung entsprechende @echo .... & pause - Befehle einfügt. Dann kann man sich ansehen, was dabei rauskommen würde.
Die Lösung deines aufgeführten Problems kannst du aber auch mit einem Einzeiler lösen (auf der Kommandozeile nur 1 %-Zeichen verwenden):
For /f "delims==" %%A in ('Dir "C:\Dokumente und Einstellungen\test.lnk" /b /s') do del "%%A"
Zitat von @78632:
> Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.
Funktioniert doch, wenn du die "" lässt.
Sorry,> Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.
Funktioniert doch, wenn du die "" lässt.
aber er meint wohl die direkte Extraktion von Postion,Länge aus einem Batchparameter.
Das geht wohl nicht weil die Syntax nicht eindeutig wäre,
bei einer Umgebungsvariable hat man ein abschließendes Prozent-/Ausrufezeichen.
Die doppelten Prozentzeichen kennzeichnen die Schleifenvariablen mit der Möglichkeit der Tilde Kommandos,
die ja auch bei den Batchparametern funktionieren.
Es gibt ja so schon Situationen wo der Parser nicht eindeutig arbeiten kann,
wenn man einstellige Buchstaben als Umgebungsvariablenamen benutzt.
Gruß
LotPings
@77559
Stimmt, haste Recht.
Ich hatte die Zeile 07 aus seinem Script betrachtet.
Stimmt, haste Recht.
Ich hatte die Zeile 07 aus seinem Script betrachtet.
Zeile 06 aus deinem Beispiel so ändern:
Gruß
LotPings
Edit und Zeile 07 raus
Set "Full=%~1"
Gruß
LotPings
Edit und Zeile 07 raus
"%%A" hat ja immer noch die %-Zeichen drum herum.
Du hattest aber "%%~A" geschrieben, und mit der Tilde ~ werden die umschließenden Anführungszeichen ja wieder weggenommen.Was muss ich also schreiben, um einen Parameter, der Leerzeichen enthält, ohne umschließende Anführungsstriche
übergeben zu können? Oder geht das nicht?
übergeben zu können? Oder geht das nicht?
Das geht nicht. Einen Parameter mit darin enthaltenen Leerzeichen musst du in Anführungszeichen setzen, also in deinem Fall "%%A"