Doppelte Path Einträge mittels Batchfile entfernen und Path mittels setx neu setzen
Hall,
ich habe folgendes Problem. Ich möchte in einem Batchfile einige Systemvariablem mittels setx setzen und zusätzlich die Pathvariable erweiteren.
Das Batchfile wird bei jedem Login aufgerufen weshalb ich schaue, ob der hinzuzufügende Pfad bereits im Path vorhanden ist. Das funktioniert auch schon ganz gut.
Problematisch ist, dass sich der Path beim Aufruf von set aus der Systemvariable Path und der (usersprzifischen) Umgebungsvariable zusammen setzt und deshalb nach jetzigen Stand, die Einträge der Umgebungsvariable, anschl. doppelt im Path vorhanden sind. Diese möchte ich jetzt aus dem Path entfernen. Meine Idee war erstmal den Inhalt der Pathvariable in eine Datei zu schreiben. Jeden Eintag in eine neue Zeile und nacher alles wieder zusammen zu bauen ohne doppelte Einträge zu berücksichtigen. Allerdings bekomme ich es schon nicht hin jeden Eintrag aus der Pathvariable mit einem anschl.Zeilenumbruch in eine Datei zu schreiben.
Würde mich freunen, wenn jemand den einen oder anderen guten Vorschlag für mein Problem hat und mir evtl. sogar erklären kann, warum das mit Zeilenumbruch nicht funktioniert.
Danke schon mal und Gruß
Mario
ich habe folgendes Problem. Ich möchte in einem Batchfile einige Systemvariablem mittels setx setzen und zusätzlich die Pathvariable erweiteren.
Das Batchfile wird bei jedem Login aufgerufen weshalb ich schaue, ob der hinzuzufügende Pfad bereits im Path vorhanden ist. Das funktioniert auch schon ganz gut.
Problematisch ist, dass sich der Path beim Aufruf von set aus der Systemvariable Path und der (usersprzifischen) Umgebungsvariable zusammen setzt und deshalb nach jetzigen Stand, die Einträge der Umgebungsvariable, anschl. doppelt im Path vorhanden sind. Diese möchte ich jetzt aus dem Path entfernen. Meine Idee war erstmal den Inhalt der Pathvariable in eine Datei zu schreiben. Jeden Eintag in eine neue Zeile und nacher alles wieder zusammen zu bauen ohne doppelte Einträge zu berücksichtigen. Allerdings bekomme ich es schon nicht hin jeden Eintrag aus der Pathvariable mit einem anschl.Zeilenumbruch in eine Datei zu schreiben.
@echo off
setlocal enabledelayedexpansion
set NewPath=c:\test
for /f "tokens=1* delims=;" %%A in ('echo %PATH%') do (
REM if /i %%A EQU "%NewPath%" goto NEXT
echo %%A. >> tmp.txt
echo. >>tmp.txt
)
echo PATH NICHT GEFUNDEN
set "Path=%Path%;%NewPath%"
setx Path "%Path%" -m
:NEXT
del tmp.txt
Würde mich freunen, wenn jemand den einen oder anderen guten Vorschlag für mein Problem hat und mir evtl. sogar erklären kann, warum das mit Zeilenumbruch nicht funktioniert.
Danke schon mal und Gruß
Mario
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 173063
Url: https://administrator.de/forum/doppelte-path-eintraege-mittels-batchfile-entfernen-und-path-mittels-setx-neu-setzen-173063.html
Ausgedruckt am: 05.07.2025 um 23:07 Uhr
19 Kommentare
Neuester Kommentar

Moin,
Und da du schon bemerkt hast, dass es via Set nicht so einfach funktioniert - nimm dich den anderen Weg zu den Infos...
bzw:
Und den anderen Ast findest du sicherlich auch...
Ps: Wir sprechen aber schon von Windows NT 3.51?
Gruß
- Das mit dem @echo off ist nicht wirklich mein Ding...
- setlocal enabledelayedexpansion ist für mich - ohne Kaffee im Kopp auch nicht wirklich an der stelle verständlich
Und da du schon bemerkt hast, dass es via Set nicht so einfach funktioniert - nimm dich den anderen Weg zu den Infos...
reg query HKEY_CURRENT_USER\Environment /v path
bzw:
for /f "skip=3 tokens=2,* delims=;" %%a in ('reg query HKEY_CURRENT_USER\Environment /v path') do echo %%a
Ps: Wir sprechen aber schon von Windows NT 3.51?
Gruß
Moin Mario.Steinberg,
das Teilproblem "jeden Eintrag aus der Pathvariable mit einem anschl.Zeilenumbruch in eine Datei zu schreiben" könntest du wie folgt lösen.
[.Demo am CMD-Prompt; führendes ">" nicht mit eingeben]
In einem Batchschnipsel und mit Umleitung in eine Datei (falls erforderlich) dann sinngemäß
Grüße
Biber
das Teilproblem "jeden Eintrag aus der Pathvariable mit einem anschl.Zeilenumbruch in eine Datei zu schreiben" könntest du wie folgt lösen.
[.Demo am CMD-Prompt; führendes ">" nicht mit eingeben]
>@for %i in ( "%path:;=" "%" ) do @echo %~i
[Ausgabe]
C:\Oracle\Home\11.2\11.2.0\client_1\bin
C:\Oracle\Home\10.2\bin
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
.....
In einem Batchschnipsel und mit Umleitung in eine Datei (falls erforderlich) dann sinngemäß
...
(for %%i in ( "%path:;=" "%" ) do echo %%~i) >X:\pfad\derPathInZeilen.txt
..
Grüße
Biber

Hi,
nein, ich würde versuchen, das so zu lösen:
Damit entfernst du zwar keine doppelten Einträge, verhinderst aber, dass neue dazukommen.
Gruß
nein, ich würde versuchen, das so zu lösen:
path | findstr /i "gesuchter Pfad/Teilpfad" > nul && echo vorhanden (setx nicht ausführen) || @echo nicht vorhanden (setx ausführen)
Damit entfernst du zwar keine doppelten Einträge, verhinderst aber, dass neue dazukommen.
Gruß

moin,
an dieser Stelle würde ich gerne einen Break machen...
Denn "frickeln/friemeln/Bibern/Pitschen/Bastlan/[nickdeinerWahl]" ist immer eine nette Abwechslung, aber es gibt ganz sicher bessere quoten, wenn der Grund == das Ziel bekannt sind.
Also - was genau soll es denn werden?
Gruß
an dieser Stelle würde ich gerne einen Break machen...
das Frühstück "die Pflicht" ist verdaut und bevor wir zur Kür kommen...Die Korinther undfast alle Koriphäen sind schon da und bevor die sich auch noch die Whiskeyflasche ins Müsli kippen, obwohl die ab jetzt in die Bolognese Spaghettigehören..
- Was ist das Ziel und warum denkst du, es muß so wie du es beschreibst ablaufen?
Denn "frickeln/friemeln/Bibern/Pitschen/Bastlan/[nickdeinerWahl]" ist immer eine nette Abwechslung, aber es gibt ganz sicher bessere quoten, wenn der Grund == das Ziel bekannt sind.
Also - was genau soll es denn werden?
Gruß

?
Zerlege es doch einfach...
Vielleicht wird es so deutlicher:
vielleicht kann er mir kurz erklären was diese kryptisch anmutende Zeile macht?
(echo %path:;=;&echo\%)|find /i "c:\windows;">nul&& echo Schon drin
Zerlege es doch einfach...
(echo %path:;=;&echo\%)
- macht was genau?
(echo %path:;=;&echo\%)|find /i "c:\windows;"
- und diese Erweiterung?
Vielleicht wird es so deutlicher:
&& == vorheriger Befehl liefert alles banane zurück
|| == der vorherige Befehl war grütze
Ich habe mehrere Clients in einer Domäne auf denen beim Einloggen ein Skript aufgerufen wird.
Dieses kann u.U. mehrfach am Tag angepasst sein.
In diesem sollen nun auch eineige Systemvariablen gesetzt und der Path erweitert werden. Soweit zum Plan.
Dieses kann u.U. mehrfach am Tag angepasst sein.
In diesem sollen nun auch eineige Systemvariablen gesetzt und der Path erweitert werden. Soweit zum Plan.
- Ein Skript, das als startupscript läuft und das prüft die Variablen und setzt Sie im Fehlerfall mit setx -m
Gruß

Hi,
der Systempfad (machine environment) steht in
als REG_EXPAND_SZ - Wert PATH.
Den musst du dann halt mit reg query beackern und auswerten.
Und wenn du setx mit dem Parameter /? oder auch ganz ohne Parameter aufrufst, findest du auch sicher die Option, wie man nur das "machine environment" verändert.
Gruß
Edit: Dass der Parameter -m bereits verwendet wurde, hatte ich leider überlesen.
der Systempfad (machine environment) steht in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Den musst du dann halt mit reg query beackern und auswerten.
Und wenn du setx mit dem Parameter /? oder auch ganz ohne Parameter aufrufst, findest du auch sicher die Option, wie man nur das "machine environment" verändert.
Gruß
Edit: Dass der Parameter -m bereits verwendet wurde, hatte ich leider überlesen.

Hi,
Danke, das ist mir bekannt. Deshalb habe ich ja zum Regeintrag auch geschrieben:
Gruß
Vielleicht ist folgende Beschreibung zugänglicher:
Danke, das ist mir bekannt. Deshalb habe ich ja zum Regeintrag auch geschrieben:
Den musst du dann halt mit reg query beackern und auswerten.
Gruß

Moin,
@ MarioichbeissgleichindenSteinberg...
Dieser komische Fuzzi mit dem Klappenauge hat dir doch ne halbe stunde und ein paar zerquetschte Steine als allerallerallersterster auf deine Frage genau das geschrieben, hast du das nicht gelesen?
Manchmal denk ich wirklich, ich sollte in einer anderen Sprache schreiben...
Und nein - die problematik mit dem geteilten und wieder zusammengesetzten Path mußt du hier niemandem erklären....
Und der Pietschen einzeilerei ist es wurstregal, ob der Wert in diesem oder jedem Pfad vorhanden ist, issers nicht rein, issers doch nicht rein.
Apropos rein - etwas mehr Mühe und Testen deinerseits, sonst mach ich die Keksdose zu..
keine Arme - keine kekse haben andere schon wegen viel weniger von mir bekommen
@ MarioichbeissgleichindenSteinberg...
Dieser komische Fuzzi mit dem Klappenauge hat dir doch ne halbe stunde und ein paar zerquetschte Steine als allerallerallersterster auf deine Frage genau das geschrieben, hast du das nicht gelesen?
Manchmal denk ich wirklich, ich sollte in einer anderen Sprache schreiben...
Und nein - die problematik mit dem geteilten und wieder zusammengesetzten Path mußt du hier niemandem erklären....
Und der Pietschen einzeilerei ist es wurstregal, ob der Wert in diesem oder jedem Pfad vorhanden ist, issers nicht rein, issers doch nicht rein.
Apropos rein - etwas mehr Mühe und Testen deinerseits, sonst mach ich die Keksdose zu..
keine Arme - keine kekse haben andere schon wegen viel weniger von mir bekommen
moin,
[OT]
und wo bleibt die Armada der KampfKekse?
[/OT]
wenn Die BenutzerVariable den Inhalt hat, dann muss ebend erst %Path% abgerfragt werden und danach entsprechend der RegistryWert.
Im Batch entsprechend %%i statt %i
zu beachten ist: im Neuen Path stehen die Pfade fest Verankert und nicht mit %Systemroot%
wenn doppelte Einträge in der Variable vorhanden sind sollte man zum Aussortieren gleich die Reihenfolge bearbeiten
Gruß Phil
[OT]
und wo bleibt die Armada der KampfKekse?
[/OT]
wenn Die BenutzerVariable den Inhalt hat, dann muss ebend erst %Path% abgerfragt werden und danach entsprechend der RegistryWert.
for %i in ("C:\Windir") do @(echo %path:;=;&echo\%;)|find "%~i;" >nul || for /f "tokens=2,*" %j in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path') do @if not "%k" == "" @echo ;%k;|find /i ";%~i;">nul || echo Test setx "%k;%~i" /m
Im Batch entsprechend %%i statt %i
zu beachten ist: im Neuen Path stehen die Pfade fest Verankert und nicht mit %Systemroot%
wenn doppelte Einträge in der Variable vorhanden sind sollte man zum Aussortieren gleich die Reihenfolge bearbeiten
Gruß Phil

Servus Phil,
Ein freudscher Vertipper?
Retour
Ein freudscher Vertipper?
Gruß Phil
[/OT]Retour

Hi,
wenn du die Einträge direkt in der Reg änderst und anschließend über die Systemsteuerung im Eingabefeld der "Umgebungsvariablen" irgendwas änderst und wieder wegnimmst und dann auf "Übernehmen" klickst, ist kein Neustart erforderlich, ansonsten schon.
Das ist also keine wirkliche Alternative für eine Automatik.
Du könntest aber versuchen, ob man das mit setx -m und irgendeinem Dummywert umgehen könnte.
Gruß
wenn du die Einträge direkt in der Reg änderst und anschließend über die Systemsteuerung im Eingabefeld der "Umgebungsvariablen" irgendwas änderst und wieder wegnimmst und dann auf "Übernehmen" klickst, ist kein Neustart erforderlich, ansonsten schon.
Das ist also keine wirkliche Alternative für eine Automatik.
Du könntest aber versuchen, ob man das mit setx -m und irgendeinem Dummywert umgehen könnte.
Gruß
moinn Timo,
[OT]
Pommes mit Mayo? - Oder gerührt!
Ich hätt da lieber paar Nudeln in der Flasche... die passen Besser zum Ketschup auf den Teller.
[/OT]
@mario
Da Du das ganze als StartSkript laufen lassen willst:
SetX übernimmt die Variablen auch Sofort nach dem Setzen.
Es kommt Natürlich darauf an aus Welcher Umgebung das gestartet wird. Das System läuft aber schon in einer definierten Umgebung, welche solange besteht bis sie neu geladen wird.
Bestehen in der Aktuellen Umgebung Variablen - werden diese Durch setzen von SetX Nicht Verändert.
Wird CMD beendet und nacher neu gestartet ist auch eine Neue Umgebung Vorhanden.
die heissen ja nicht umsonst UmgebungsVariablen
das Zusammenführen einer *.reg beeinflusst das sofortige setzten für eine neue CMD-instanz Nicht
Gruß Phil
[OT]
Pommes mit Mayo? - Oder gerührt!
Ich hätt da lieber paar Nudeln in der Flasche... die passen Besser zum Ketschup auf den Teller.
[/OT]
@mario
Da Du das ganze als StartSkript laufen lassen willst:
SetX übernimmt die Variablen auch Sofort nach dem Setzen.
Es kommt Natürlich darauf an aus Welcher Umgebung das gestartet wird. Das System läuft aber schon in einer definierten Umgebung, welche solange besteht bis sie neu geladen wird.
Bestehen in der Aktuellen Umgebung Variablen - werden diese Durch setzen von SetX Nicht Verändert.
Wird CMD beendet und nacher neu gestartet ist auch eine Neue Umgebung Vorhanden.
die heissen ja nicht umsonst UmgebungsVariablen
das Zusammenführen einer *.reg beeinflusst das sofortige setzten für eine neue CMD-instanz Nicht
Gruß Phil

Zitat von @pieh-ejdsch:
das Zusammenführen einer *.reg beeinflusst das sofortige setzten für eine neue CMD-instanz Nicht
das Zusammenführen einer *.reg beeinflusst das sofortige setzten für eine neue CMD-instanz Nicht
Das Zusammenführen einer .reg beeinflusst das sofortige Setzen für eine neue CMD-Instanz sehr wohl, wenn man - wie ich beschrieben habe - setx -m nach dem Zusammenführen mit einem Dummy nutzt.