Jak zaktualizować zmienną PATH na stałe z cmd? Okna
Jeśli wykonam set PATH=%PATH%;C:\\Something\\bin
z cmd, a następnie wykonam echo %PATH%
widzę ten łańcuch dodany w path. Jeśli zamknę i otworzę cmd, ten nowy łańcuch nie będzie w PATH. Jak mogę trwale zaktualizować ścieżkę z cmd dla wszystkich procesów w przyszłości, a nie tylko dla bieżącego procesu?
Nie chcę tego robić przechodząc do Właściwości systemu - > Zaawansowane - > Zmienne środowiskowe i tam ścieżka aktualizacji.
To polecenie musi być wykonane z aplikacji java(moje inne pytanie ).
7 answers
Dokumentacja jak to zrobić znajduje się na MSDN. Kluczowy Wyciąg jest taki:
Aby programowo dodawać lub modyfikować systemowe zmienne środowiskowe, dodaj je do klucza rejestru HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment , a następnie nadaj
WM_SETTINGCHANGE
wiadomość z lParam ustawionym na łańcuch "Environment". Dzięki temu aplikacje, takie jak powłoka, mogą odbierać aktualizacje.
Zauważ, że Twój aplikacja będzie potrzebowała podwyższonych uprawnień administratora, aby móc modyfikować ten klucz.
Zaznaczasz w komentarzach, że z chęcią zmodyfikujesz tylko środowisko dla poszczególnych użytkowników. W tym celu należy edytować wartości w HKEY_CURRENT_USER\Environment. Tak jak wcześniej, upewnij się, że transmitujesz WM_SETTINGCHANGE
wiadomość.
Powinieneś być w stanie to zrobić z aplikacji Java wystarczająco łatwo, używając klas rejestru JNI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 16:13:01
Możesz użyć:
setx PATH "%PATH%;C:\\Something\\bin"
Jednakże setx
obetnie zapisany ciąg znaków do 1024 bajtów, co może spowodować uszkodzenie ścieżki.
/M
zmieni PATH
w HKEY_LOCAL_MACHINE
zamiast HKEY_CURRENT_USER
. Innymi słowy, zmienna systemowa, zamiast użytkownika. na przykład:
SETX /M PATH "%PATH%;C:\your path with spaces"
Należy pamiętać, że nowa ścieżka nie jest widoczna w bieżącym cmd.exe
.
Ale jeśli spojrzysz w rejestrze lub na nową cmd.exe
z "set p"
, zobaczysz nową wartość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 22:38:39
Ostrzegam przed użyciem polecenia
setx PATH "%PATH%;C:\Something\bin"
Aby zmodyfikować zmienną PATH ze względu na" cechę " jej implementacji. Na wielu (większość?) instalacje w dzisiejszych czasach zmienna będzie długa - setx
obetnie zapisany łańcuch znaków do 1024 bajtów, co może spowodować uszkodzenie ścieżki (patrz dyskusja tutaj).
(zarejestrowałem się specjalnie, aby zaznaczyć ten problem, a więc brak reputacji witryny, aby bezpośrednio skomentować odpowiedź napisaną w maju 2 '12. Moje podziękowania dla beresfordt za dodanie takiego komentarza )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 10:18:21
Ten skrypt Pythona [ * ] robi dokładnie to:
"""
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:])
Poniżej znajdują się przykłady użycia, zakładając, że został on zapisany w pliku o nazwie setenv.py
gdzieś w bieżącej ścieżce.
Zauważ, że w tych przykładach ja nie miałem uprawnień administratora , więc zmiany dotyczyły tylko drzewa rejestru mojego lokalnego użytkownika:
> 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/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-30 12:56:45
W celach informacyjnych, dla każdego, kto szuka sposobu zmiany ścieżki za pomocą kodu, przytaczam przydatny post programisty Delphi z tej strony: http://www.tek-tips.com/viewthread.cfm?qid=686382
TonHu (programista) 22 paź 03 17:57 znalazłem gdzie przeczytałem oryginał posting, it ' s here: http://news.jrsoftware.org/news/innosetup.isx/msg02129....
Fragment tego, czego potrzebujesz, to:
Należy określić string "Environment" w LParam. W Delphi byś zrób to w ten sposób:
Zasugerował: Jordan Russell http://www.jrsoftware.org , the autor (a.o.) InnoSetup, ("Inno Setup to darmowy instalator dla Programy Windows. Po raz pierwszy wprowadzony w 1997 roku, Inno Setup dziś konkuruje a nawet przewyższa wielu komercyjnych instalatorów w zestawie funkcji i stabilność.") (Po prostu chciałbym, aby więcej osób korzystało z InnoSetup)SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
HTH
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-22 10:18:48
Ten skrypt http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
Zawiera wszystkie niezbędne wywołania Windows API, które można zrefakturować dla Twoich potrzeb. W rzeczywistości jest to AutoHotkey GUI, aby łatwo zmienić ścieżkę systemową. Musi być uruchomiony jako Administrator.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-07 20:27:12
W sieci korporacyjnej, gdzie użytkownik ma ograniczony dostęp i korzysta z przenośnych aplikacji, istnieją następujące sztuczki z wiersza poleceń:
- zapytanie do zmiennych ENV użytkownika:
reg query "HKEY_CURRENT_USER\Environment"
. Użyj"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
dla LOCAL_MACHINE. - Dodaj nową zmienną użytkownika env:
reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ
. UżyjREG_EXPAND_SZ
dla ścieżek zawierających inne zmienne%%. - Usuń istniejącą zmienną env:
reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 15:26:50