Windows 7 Registry, PATH Variable verändern/verkürzen

F_GXdx

Captain
Registriert
März 2006
Beiträge
4.028
Hi,

Ich bekomme einen String Parameter rein, der aus der PATH Variable unter "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
rausgeschnitten werden soll.

Mit einer Batch Datei scheint es wahnsinnig kompliziert zu sein.

Meine Frage: Wie würdet ihr das überhaupt angehen? Möglichst elegant und mit wenig Aufwand. Doch eine Batch Datei? Sich ne Exe bauen? Gibt es ein kleines Helferprogramm dafür?

ZB:
Nehmen wir mal vereinfacht an, die aktuelle Path Variable ist:

;%SystemRoot%\system32;C:\Program Files;

und der String ist C:\Program Files, dann soll die neue Path Variable

;%SystemRoot%\system32; sein.

Danke.
 
Win + Pause drücken, Erweiterte Systemeinstellungen, Erweitert, Umgebungsvariablen. Dafür brauchst du die Registry nicht. Ich hab auch ein kleines Programm in C# dafür gebastelt mit Backup-Funktion, allerdings nur mit der PATH-Variable kompatibel. Wenn du willst, kann ichs dir gern mal hochladen.
 
Es muss eine .bat oder .exe file sein, die den Parameter bekommt und die Änderung durchführt.

C# ist nicht unbedingt optimal, aber evtl wäre es ganz gut.
 
Na gut, sowas hab ich nicht parat. Nur eine GUI für die vollständige PATH-Variable. Über ein Batch-Script wirst du dabei nicht glücklich, da die Änderungen nur für die Registry gelten (ergo beim nächsten Anmelden erst für alle Fenster verfügbar sind) und nicht für alle Fenster gelten. Außer du findest ein Tool, womit du Systemmeldungen losschicken kannst. ;)
 
Naja wirst lachen, ich habe jetzt folgendes Batch.Script, dass testweise eine zweite Path-Variable "Path2" anlegen kann:

Code:
REGEDIT4

; @ECHO OFF
; CLS
; REGEDIT.EXE /S "%~f0"
; EXIT


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"Path2"="%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;"

Eventuell werde ich mich doch durch die Batch Syntax quälen müssen :freak:
 
Was willst du denn genau machen? Etwas entfernen, etwas ersetzen? Den Code müsstest du halt etwas anpassen:
Code:
@echo off

set reg=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set val=PATH

reg add "%reg%" /v "%val%" /t REG_SZ /d "%path:alter_wert=neuer_wert%"
Ungetestet.

Ich bezweifel aber dass dies dynamisch geht, denn Strings dynamisch zu ersetzen wird schwer (siehe alter_wert und neuer_wert).
 
Servus,

Du hast Glück, ich habe mir vor ein paar Monaten ein C-Programm dafür geschrieben ein Directory an den Pfad anzuhängen :)
Sieht ungefähr so aus:

Code:
#include <stdio.h>
#include <windows.h>


// see also:
// https://github.com/dmoulding/editenv/blob/master/EnvVar.cpp
// https://github.com/dmoulding/editenv
// http://stackoverflow.com/questions/1919125/programmatically-adding-a-directory-to-windows-path-environment-variable


int main (int argc, char **argv)
{
	HKEY subKey;
	DWORD size;
	long status;
	PBYTE data;
	char path[1050];
	DWORD_PTR result;
	UINT const broadcastTimeout = 100; // in milliseconds	
	

	RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\Environment" , 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &subKey);
	status = RegQueryValueEx(subKey, "Path", 0, NULL, NULL, &size);
	if (size<1022)
	{
		RegQueryValueEx(subKey, "Path", 0, NULL, path, &size);
		fprintf(stderr, "path=%s\n", path);
	}
	else
        {
                fprintf(stderr, "Error: path too long\n");
                exit(1);
        }

//	strcat(path, ";");
//	strcat(path, new_dir);
	
	RegSetValueEx(subKey, "Path", 0, REG_EXPAND_SZ, path, strlen(path) );
	RegCloseKey(HKEY_LOCAL_MACHINE);

    // Notify everyone of the change.
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_NORMAL, broadcastTimeout, &result);
}
Du musst eigentlich nur noch im Code, wo "strcat" auskommentiert ist, Deinen "Aus-dem-Pfad-rausnehmen"-Code einbauen.
Und vielleicht helfen Dir auch die im Code eingebauten Links weiter...


HTH

BigNum
 
Zuletzt bearbeitet:
Danke, danke! Hab es jetzt hinbekommen. Gut waren auf jeden Fall deine Anregungen, die maximale Länge zu checken.

Es ist allerdings jetzt C# geworden. Im Namespace Microsoft.Win32 gab es die ganze Palette an vorgefertigen Funktionen.

Mit einer Batch-Datei wäre es jedenfalls Selbstmord gewesen.
 

Ähnliche Themen

Zurück
Oben