2016-07-21 16 views
0

入力オプションに応じて、HKCU(ユーザー)パスまたはHKLM(システム)パスのいずれかのレジストリを介してPATH変数にディレクトリを追加するプログラムを作成しました。レジストリでPython winreg経由でWindowsシステムPATHを設定する

ユーザーパスを使用するとうまくいきます。 しかし、システムのパスを設定するとき、Windowsはパス変数が空であるかのように動作します。

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

しかし、echo %path%は、構文エラーなしで、適​​切にすべてを出力します。同様に、システムプロパティGUIで変数を表示すると、フルパスが適切に表示されます。

%SystemRoot%\system32;%SystemRoot%;

私は手動で(すなわち、顕著な一見無関係な変更を行う)GUIでその変数を開き、最後のセミコロンを追加または削除する場合さて、その後、パスが正常に動作するようです。

はい、新しいコマンドウィンドウを開いてパスを確認しています。マシンを再起動しても何もしないようです。

アイデア?

コードの抜粋はここにある:コメントのように

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

パスは、その中に1つ以上の「%」文字が含まれている場合は、 'REG_EXPAND_SZ'値を作成する必要があります。 – eryksun

+0

また、Explorerが環境をリロードするようにするには、ctypesまたはPyWin32を使用して['WM_SETTINGCHANGE'](https://msdn.microsoft.com/en-us/library/ms725497)「環境」メッセージをブロードキャストする必要があります。 – eryksun

+0

@REG_EXPAND_SZがトリックをしました! ---そのプロパティは**の**%を含んでいない場合は動作しますか? – tenwest

答えて

1

REG_EXPAND_SZREG_SZを変更し、「%」を使用して変数が認識されていなかったとして、トリックをしました。これは "%"が存在しないときにも機能するので、2つの間で切り替えるのではなく、ユーザーパスにも使用します。

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

+1

キー列挙の順序がWindows APIによって定義されていないため、環境変数に 'REG_EXPAND_SZ'を無条件に使用しません。 regeditはアルファベット順のビューを表示しますが、実際の列挙は作成順です。これを回避するために、環境は2段階でロードされ、 'REG_SZ'値は* REG_EXPAND_SZ値の前にロードされます。したがって後者は安全に 'REG_SZ'値を参照できますが、他の' REG_EXPAND_SZ'値は参照できません。それは 'Path'のために'% '変数を持つことがかなり保証されており、 'REG_EXPAND_SZ'値でなければなりません。 – eryksun

+0

説明と解決をありがとう! – tenwest

関連する問題