Cmdからset PATH=%PATH%;C:\\Something\\bin
を実行してからecho %PATH%
を実行すると、この文字列がpathに追加されます。 cmdを閉じて開くと、その新しい文字列はPATHにありません。現在のプロセスだけでなく、将来のすべてのプロセスでcmdからPATHを永続的に更新するにはどうすればよいですか? [システムのプロパティ]-> [詳細設定]-> [環境変数]に移動してPATHを更新することでこれを行いたくありません。
このコマンドは、Javaアプリケーションから実行する必要があります(他の question )。
これを行う方法に関するドキュメントは MSDN にあります。主な抽出は次のとおりです。
プログラムでシステム環境変数を追加または変更するには、それらをHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environmentレジストリキーに追加し、次にブロードキャストします-
WM_SETTINGCHANGE
lParamが文字列「Environment」に設定されたメッセージ。これにより、シェルなどのアプリケーションが更新を取得できます。
このキーを変更できるようにするには、アプリケーションに管理者権限の昇格が必要になることに注意してください。
コメントで、ユーザーごとの環境のみを変更してもかまわないことを示します。これを行うには、HKEY_CURRENT_USER\Environmentの値を編集します。前と同じように、必ず WM_SETTINGCHANGE
メッセージをブロードキャストしてください。
これは、JNIレジストリクラスを使用して、Javaアプリケーションから簡単に実行できるはずです。
次を使用できます。
setx PATH "%PATH%;C:\\Something\\bin"
ただし、setx
は保存された文字列を1024バイトに切り捨て、PATHを破損する可能性があります。
/M
は、HKEY_LOCAL_MACHINE
ではなく、HKEY_CURRENT_USER
のPATH
を変更します。つまり、ユーザーのシステム変数ではなく、システム変数。例えば:
SETX /M PATH "%PATH%;C:\your path with spaces"
新しいPATHは現在のcmd.exe
には表示されないことに注意してください。
しかし、レジストリまたはcmd.exe
を含む新しい"set p"
を見ると、新しい値を確認できます。
コマンドの使用には注意してください
setx PATH "%PATH%;C:\Something\bin"
実装の「機能」のためにPATH変数を変更する。最近の多くの(ほとんどの?)インストールでは、変数は長くなります-setx
は、保存された文字列を1024バイトに切り捨て、潜在的にPATHを破損します(議論 here を参照)。
(この問題にフラグを立てるために特別にサインアップしたため、12年5月2日に投稿された回答に直接コメントするサイトの評判がありません。コメントを追加してくれたberesfordtに感謝します))
このPythonスクリプト[*]は、まさにそれを行います。
"""
Show/Modify/Append registry env-vars (ie `PATH`) and notify Windows-applications to pickup changes.
First attempts to show/modify HKEY_LOCAL_MACHINE (all users), and
if not accessible due to admin-rights missing, fails-back
to HKEY_CURRENT_USER.
Write and Delete operations do not proceed to user-tree if all-users succeed.
Syntax:
{prog} : Print all env-vars.
{prog} VARNAME : Print value for VARNAME.
{prog} VARNAME VALUE : Set VALUE for VARNAME.
{prog} +VARNAME VALUE : Append VALUE in VARNAME delimeted with ';' (i.e. used for `PATH`).
{prog} -VARNAME : Delete env-var value.
Note that the current command-window will not be affected,
changes would apply only for new command-windows.
"""
import winreg
import os, sys, win32gui, win32con
def reg_key(tree, path, varname):
return '%s\%s:%s' % (tree, path, varname)
def reg_entry(tree, path, varname, value):
return '%s=%s' % (reg_key(tree, path, varname), value)
def query_value(key, varname):
value, type_id = winreg.QueryValueEx(key, varname)
return value
def yield_all_entries(tree, path, key):
i = 0
while True:
try:
n,v,t = winreg.EnumValue(key, i)
yield reg_entry(tree, path, n, v)
i += 1
except OSError:
break ## Expected, this is how iteration ends.
def notify_windows(action, tree, path, varname, value):
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
print("---%s %s" % (action, reg_entry(tree, path, varname, value)), file=sys.stderr)
def manage_registry_env_vars(varname=None, value=None):
reg_keys = [
('HKEY_LOCAL_MACHINE', r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'),
('HKEY_CURRENT_USER', r'Environment'),
]
for (tree_name, path) in reg_keys:
tree = eval('winreg.%s'%tree_name)
try:
with winreg.ConnectRegistry(None, tree) as reg:
with winreg.OpenKey(reg, path, 0, winreg.KEY_ALL_ACCESS) as key:
if not varname:
for regent in yield_all_entries(tree_name, path, key):
print(regent)
else:
if not value:
if varname.startswith('-'):
varname = varname[1:]
value = query_value(key, varname)
winreg.DeleteValue(key, varname)
notify_windows("Deleted", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
else:
value = query_value(key, varname)
print(reg_entry(tree_name, path, varname, value))
else:
if varname.startswith('+'):
varname = varname[1:]
value = query_value(key, varname) + ';' + value
winreg.SetValueEx(key, varname, 0, winreg.REG_EXPAND_SZ, value)
notify_windows("Updated", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
except PermissionError as ex:
print("!!!Cannot access %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
except FileNotFoundError as ex:
print("!!!Cannot find %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
if __name__=='__main__':
args = sys.argv
argc = len(args)
if argc > 3:
print(__doc__.format(prog=args[0]), file=sys.stderr)
sys.exit()
manage_registry_env_vars(*args[1:])
以下は、現在のパスのどこかにあるsetenv.py
というファイルに保存されていると仮定した場合の使用例です。これらの例では、iはadmin-rightsを持っていなかったため、変更はローカルユーザーのレジストリツリーのみに影響したことに注意してください。
> REM ## Print all env-vars
> setenv.py
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
HKEY_CURRENT_USER\Environment:PATH=...
...
> REM ## Query env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
!!!Cannot find HKEY_CURRENT_USER\Environment:PATH due to: [WinError 2] The system cannot find the file specified
> REM ## Set env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo
> REM ## Append env-var:
> setenv.py +PATH D:\Bar
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo;D:\Bar
> REM ## Delete env-var:
> setenv.py -PATH
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Deleted HKEY_CURRENT_USER\Environment:PATH
[*]適応元: http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/
ユーザーのアクセスが制限され、ポータブルアプリを使用する企業ネットワークでは、次のコマンドライントリックがあります。
reg query "HKEY_CURRENT_USER\Environment"
。 LOCAL_MACHINEには"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
を使用します。reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ
。他の%%変数を含むパスにはREG_EXPAND_SZ
を使用します。reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir
。参照目的で、コードを使用してパスを変更する方法を探している人のために、このWebページからDelphiプログラマーによる有用な投稿を引用しています: http://www.tek-tips.com/viewthread.cfm? qid = 686382
TonHu(プログラマー)22 Oct 03 17:57私は元の投稿を読んだ場所を見つけました、それはここにあります: http://news.jrsoftware.org/news/innosetup.isx/msg02129 ....
必要なものの抜粋は次のとおりです。
LParamで文字列「Environment」を指定する必要があります。 Delphiでは、次のようにします。
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
Jordan Russellが提案しました http://www.jrsoftware.org 、(ao)InnoSetupの作者( "Inno SetupはWindowsプログラムの無料インストーラーです。1997年に導入されたInno現在のセットアップはライバルに匹敵し、機能セットと安定性において多くの商用インストーラーを上回っています。」)(InnoSetupを使用する人を増やしたいです
HTH
このスクリプト http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
必要に応じてリファクタリングできるすべての必要なWindows API呼び出しが含まれています。実際には、システムパスを簡単に変更するAutoHotkey GUIです。管理者として実行する必要があります。