2016-07-21 9 views
0

Ich habe ein Programm geschrieben, um Verzeichnisse zu der PATH-Variable über die Registrierung hinzufügen, entweder der HKCU (Benutzer) oder HKLM (System) -Pfad, abhängig von einer Eingabeoption.Windows-System PATH in der Registrierung über Python einstellen winreg

Es funktioniert gut, wenn Sie den Benutzerpfad verwenden. Wenn jedoch der Pfad für das System festgelegt wird, verhält sich Windows so, als ob die Pfadvariable leer wäre, z.

'notepad' is not recognized as an internal or external command....

jedoch echo %path% druckt alles in geeigneter Weise aus, ohne Syntaxfehler. Wenn ich die Variable in der GUI für Systemeigenschaften anzeigen lasse, zeigt sie ähnlich meinen vollständigen Pfad an, z.

%SystemRoot%\system32;%SystemRoot%;

Nun, wenn ich in der GUI diese Variable manuell öffnen und hinzufügen oder den nachgestellten Semikolon entfernen (das heißt eine spürbare aber scheinbar irrelevante Änderung vornehme), dann scheint der Weg gut zu funktionieren.

Ja, ich öffne ein neues Befehlsfenster, um den Pfad zu überprüfen. Neustart der Maschine scheint auch nichts zu tun.

Irgendwelche Ideen?

Codeauszug ist hier:

import _winreg as registry 

#HKEY_LOCAL_MACHINE\ 
SYS_ENV_SUBPATH = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 

#HKEY_CURRENT_USER\ 
USR_ENV_SUBPATH = r"Environment" 

def update_reg_path_value(paths_to_add,privilege): 
    env_key = open_env_registry_key(privilege) 
    current_path = get_path_from_registry_or_create(env_key) 
    val_string = create_new_path_value(current_path, paths_to_add) 
    registry.SetValueEx(env_key,"Path",0,registry.REG_SZ,val_string) 


def open_env_registry_key(privilege): 
    if privilege == 'system': 
     return registry.OpenKey(registry.HKEY_LOCAL_MACHINE,SYS_ENV_SUBPATH, 
          0,registry.KEY_ALL_ACCESS) 
    return registry.OpenKey(registry.HKEY_CURRENT_USER,USR_ENV_SUBPATH, 
         0,registry.KEY_ALL_ACCESS) 
+1

Wenn der Pfad ein oder mehr Zeichen „%“ in sich hat, dann müssen Sie einen 'REG_EXPAND_SZ' Wert zu schaffen. – eryksun

+0

Um Explorer dazu zu bringen, die Umgebung neu zu laden, müssen Sie ctypes oder PyWin32 verwenden, um eine "WM_SETTINGCHANGE" (https://msdn.microsoft.com/en-us/library/ms725497) "Environment" -Meldung zu senden. – eryksun

+0

@REG_EXPAND_SZ hat den Trick gemacht !! --- Wird diese Immobilie funktionieren, wenn **% ** nicht ** enthält? – tenwest

Antwort

1

Wie in den Kommentaren, Ändern REG_SZ-REG_EXPAND_SZ den Trick, als Variablen „%“ wurden nicht erkannt zu werden. Dies funktioniert auch, wenn keine "%" vorhanden sind, also verwende ich es auch für den Benutzerpfad, anstatt zwischen den beiden wechseln zu müssen.

registry.SetValueEx(env_key,"Path",0,registry.REG_EXPAND_SZ,val_string)

+1

Wir verwenden "REG_EXPAND_SZ" nicht bedingungslos für Umgebungsvariablen, da die Reihenfolge der Schlüsselaufzählung von der Windows-API nicht definiert ist. regedit zeigt eine alphabetische Ansicht, aber die tatsächliche Enumeration befindet sich in der Erstellungsreihenfolge. Um dies zu umgehen, wird die Umgebung in zwei Stufen geladen, wobei 'REG_SZ'-Werte * vor * REG_EXPAND_SZ'-Werten geladen werden. Letzterer kann somit sicher auf "REG_SZ" -Werte verweisen, aber nicht auf andere "REG_EXPAND_SZ" -Werte. Das heißt, für 'Path' sind wir ziemlich sicher, dass es"% "- Variablen haben wird und somit ein 'REG_EXPAND_SZ'-Wert sein sollte. – eryksun

+0

Vielen Dank für die Erklärung und Lösung! – tenwest