anarchator
Goto Top

PATH-Variable (user), sicherstellen, dass Eintrag vorhanden

Hallo Experten,

trotz langer Recherche und Suche habe ich leider keine Lösung für mein Problem gefunden.

Ich möchte via Batchfile prüfen, ob für den angemeldeten User (nicht System, nur User!) in der PATH-Umgebung ein bestimmter Pfad enthalten ist. Nennen wir ihn c:\stuff

Sofern c:\stuff also nicht im user path enthalten ist, soll dieser Wert ans Ende hinzugefügt werden. Die Änderung sollte nach Möglichkeit sofort greifen.

Lässt sich das realisieren via Batch und wenn ja, wie?

Besten Dank im Voraus!

Content-ID: 81313629727

Url: https://administrator.de/forum/path-variable-user-sicherstellen-dass-eintrag-vorhanden-81313629727.html

Ausgedruckt am: 22.12.2024 um 06:12 Uhr

TK1987
TK1987 21.05.2024 aktualisiert um 11:04:24 Uhr
Goto Top
Moin,

@echo off

set "search=c:\stuff"  

for /f "Tokens=2,*" %%A in ('reg query HKCU\Environment /v Path') do echo]%%~B | >nul findstr "%search%"  
if %ErrorLevel% equ 0 (echo]Pfad ist in Umgebungsvariable Path vorhanden) else (echo]Pfad ist nicht in Umgebungsvariable Path.)
pause

Gruß Thomas
kpunkt
kpunkt 21.05.2024 um 11:06:39 Uhr
Goto Top
Ich frag lieber nach....wir sprechen hier nicht von einer Domäne?
anarchator
anarchator 21.05.2024 um 11:06:44 Uhr
Goto Top
vielen Dank Thomas, das ist schon mal ein guter Anfang. Aber wie bekomme ich im zweiten Schritt den Pfad dann hinzugefügt, sofern er nicht bereits vorhanden ist?
anarchator
anarchator 21.05.2024 um 11:07:02 Uhr
Goto Top
nein, wir sprechen nicht von einer Domäne.
9697748851
9697748851 21.05.2024 um 11:09:38 Uhr
Goto Top
Moin,

das ist schon mal ein guter Anfang
stimme zu - ein guter Anfang, die grundlegenden Programmiertaktiken zu lernen.

Pfad dann hinzugefügt, sofern er nicht bereits vorhanden ist?
Dein Pseudocode würde ja schon funktionieren..

Gruß
kpunkt
kpunkt 21.05.2024 aktualisiert um 11:11:04 Uhr
Goto Top
Ohne es ausprobiert zu haben...
Sollte da nicht ein
IF EXIST c:\stuff SET PATH=%PATH%;c:\stuff
reichen?
Bin aber auch nicht so der Batchman
13034433319
13034433319 21.05.2024 aktualisiert um 11:25:54 Uhr
Goto Top
Aber wie bekomme ich im zweiten Schritt den Pfad dann hinzugefügt, sofern er nicht bereits vorhanden ist?
@echo off
set "mypath=C:\Anotherpath"  
for /f "skip=2 tokens=1,2,*" %%a in ('reg query HKCU\Environment /v Path') do set "userpath=%%c"  
reg query HKCU\Environment /v Path | findstr /ilc:"%mypath%" >nul 2>&1 || reg add HKCU\Environment /v Path /d "%userpath%;%mypath%" /f  
Korrektur auf User-Path

Oder als Alternative mit Hilfe der Powershell in der Batch so
@echo off
set "mypath=C:\Anotherpath"  
powershell -EP Bypass -C "$mypath = '%mypath%'; $userpath = [environment]::GetEnvironmentVariable('Path','User'); if($mypath -notin ($userpath -split ';')){[Environment]::SetEnvironmentVariable('Path',"$userpath;$mypath",'User')}"  
11020714020
11020714020 21.05.2024 um 11:16:02 Uhr
Goto Top
Am Ende nimmst du den bereits existiernden Eintrag in "HKEY_CURRENT_USER\Environment und ergänzt in um den fehlenden, ggf. Noch Explorer killen, damit diese dann neu greifen
TK1987
Lösung TK1987 21.05.2024 um 11:16:46 Uhr
Goto Top
Zitat von @13034433319:
Aber wie bekomme ich im zweiten Schritt den Pfad dann hinzugefügt, sofern er nicht bereits vorhanden ist?
reg add HKCU\Environment /v Path /d "%PATH%;C:\AnotherPath" /f  
Dann hat man aber hinterher auch die Systemvariablen mit in der Uservariable drin.

@echo off

set "search=c:\stuff"  
for /f "Tokens=2,*" %%A in ('reg query HKCU\Environment /v Path') do call :checkPath "%%~B"  

pause
exit /b 0
:checkPath
  echo]%~1 | >nul findstr "%search%"  
  if %ErrorLevel% equ 0 (echo]Pfad steht in Umgebungsvariable.) else (
    reg add HKCU\Environment /v Path /t REG_EXPAND_SZ /d "%~1;%search%" /f  
    echo]Pfad wurde zur Umgebungsvariable hinzugefuegt.
  )
anarchator
anarchator 21.05.2024 um 11:40:36 Uhr
Goto Top
vielen Dank!
Irgendwas scheint bei mir aber durcheinander gekommen zu sein und ich finde die Ursache nicht:

Wenn ich in einer Admin-CMD "path" eingebe, bekomme ich folgenden Output:

C:\WINDOWS\system32>path
PATH=C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Python27\;C:\Python27\Scripts;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\WireGuard\;C:\!executable\AOMEI Backupper Technician Plus v7.1.0\App\7.1.2\AOMEI Backupper\7.2.1;C:\Program Files (x86)\Paragon Software\LinuxFS for Windows\;c:\stuff

Wenn ich dasselbe mache in einer User-CMD, bekomme ich folgenden Output:

C:\Windows\System32>path
PATH=C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Python27\;C:\Python27\Scripts;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\WireGuard\;C:\!executable\AOMEI Backupper Technician Plus v7.1.0\App\7.1.2\AOMEI Backupper\7.2.1;C:\Program Files (x86)\Paragon Software\LinuxFS for Windows\;C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Python27\;C:\Python27\Scripts;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\WireGuard\;C:\!executable\AOMEI Backupper Technician Plus v7.1.0\App\7.1.2\AOMEI Backupper\7.2.1;C:\Program Files (x86)\Paragon Software\LinuxFS for Windows\;C:\Program Files (x86)\EaseUS\Todo Backup\bin\x64\

-> Im User-Kontext ist also path "übervoll" (1024 Zeichen?) und daher konnte der Eintrag nicht hinzugefügt werden. Wenn ich aber mit "rundll32 sysdm.cpl,EditEnvironmentVariables" nachschaue, sind unter User und System die Einträge identisch, bis auf den neu hinzugefügten Ordner (der ist nur unter User vorhanden).

Wie bekomme ich meine vollgelaufenen Path-Einträge bereinigt?
TK1987
TK1987 21.05.2024 um 11:49:37 Uhr
Goto Top
Zitat von @anarchator:
Wie bekomme ich meine vollgelaufenen Path-Einträge bereinigt?
Dafür nimmst du am besten Powershell...
$User   = [Environment]::GetEnvironmentVariable("Path","User").Split(';')  
$System = [Environment]::GetEnvironmentVariable("Path","Machine").Split(';')  

$CleanUser = $User | ?{$_ -NotIn $System -and $_} | Select -Unique

[Environment]::SetEnvironmentVariable("Path",($CleanUser -Join ";"),"User")  
anarchator
anarchator 21.05.2024 um 11:56:10 Uhr
Goto Top
genial, danke euch allen!

Besonderen Dank an TK1987.