java - restaurar - ¿Cómo actualizar la variable PATH permanentemente desde cmd? Windows
variables de entorno java windows 10 (7)
A modo de referencia, para cualquier persona que busque cómo cambiar la ruta a través del código, cito una publicación útil de un programador de Delphi de esta página web: http://www.tek-tips.com/viewthread.cfm?qid=686382
TonHu (Programador) 22 Oct 03 17:57 Encontré donde leí la publicación original, está aquí: http://news.jrsoftware.org/news/innosetup.isx/msg02129 ....
El extracto de lo que necesitarías es esto:
Debe especificar la cadena "Entorno" en LParam. En Delphi lo harías de esta manera:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar(''Environment'')));
Fue sugerido por Jordan Russell, http://www.jrsoftware.org , el autor de (ao) InnoSetup, ("Inno Setup es un instalador gratuito para programas de Windows. Presentado por primera vez en 1997, Inno Setup hoy rivaliza e incluso supera a muchos instaladores comerciales en conjunto de características y estabilidad. ") (Simplemente me gustaría que más personas usen InnoSetup)
HTH
Si ejecuto set PATH=%PATH%;C://Something//bin
de cmd y luego ejecutar echo %PATH%
Veo esta cadena agregada en la ruta. Si cierro y abro cmd, esa nueva cadena no está en PATH. ¿Cómo puedo actualizar PATH permanentemente desde cmd para todos los procesos en el futuro, no solo para el proceso actual? No quiero hacer esto yendo a Propiedades del sistema -> Avanzado -> Variables de entorno y allí actualizo la RUTA.
Este comando debe ejecutarse desde la aplicación Java (mi otra question ).
Advierto contra el uso del comando
setx PATH "%PATH%;C:/Something/bin"
para modificar la variable PATH debido a una "característica" de su implementación. En muchas (¿la mayoría?) Instalaciones en estos días la variable será larga - setx
truncará la cadena almacenada a 1024 bytes, potencialmente corrompiendo la RUTA (vea la discusión here ).
( Me inscribí específicamente para marcar este problema y, por lo tanto, carezco de la reputación del sitio para comentar directamente la respuesta publicada el 2 de mayo de 2012. Mi agradecimiento a Beresfordt por agregar dicho comentario )
En una red corporativa, donde el usuario tiene acceso limitado y usa aplicaciones portátiles, existen estos trucos de línea de comando:
- Consultar las variables de env del usuario:
reg query "HKEY_CURRENT_USER/Environment"
. Use"HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment"
para LOCAL_MACHINE. - Agregue una nueva variable de
reg add "HKEY_CURRENT_USER/Environment" /v shared_dir /d "c:/shared" /t REG_SZ
usuario:reg add "HKEY_CURRENT_USER/Environment" /v shared_dir /d "c:/shared" /t REG_SZ
. UseREG_EXPAND_SZ
para las rutas que contienen otras variables %%. - Eliminar la variable env existente:
reg delete "HKEY_CURRENT_USER/Environment" /v shared_dir
.
Este script http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
incluye todas las llamadas a la API de Windows necesarias que se pueden refactorizar según sus necesidades. En realidad, es una GUI de AutoHotkey para cambiar la RUTA DEL SISTEMA fácilmente. Necesita ser ejecutado como un administrador.
Este script de Python [*] hace exactamente eso:
"""
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:])
A continuación hay algunos ejemplos de uso, asumiendo que se haya guardado en un archivo llamado setenv.py
en algún lugar de su ruta actual. Tenga en cuenta que en estos ejemplos no tenía derechos de administrador , por lo que los cambios afectaron solo el árbol de registro de mi usuario local:
> 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
[*] Adaptado de: http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/
La documentación sobre cómo hacer esto se puede encontrar en MSDN . El extracto clave es este:
Para agregar o modificar mediante programación las variables de entorno del sistema, agréguelos a la clave de registro HKEY_LOCAL_MACHINE / System / CurrentControlSet / Control / Session Manager / Environment y luego transmita un mensaje
WM_SETTINGCHANGE
con lParam establecido en la cadena "Entorno". Esto permite que las aplicaciones, como el shell, recojan sus actualizaciones.
Tenga en cuenta que su aplicación necesitará derechos de administrador elevados para poder modificar esta clave.
En los comentarios, indica que le gustaría modificar solo el entorno por usuario. Haga esto editando los valores en HKEY_CURRENT_USER / Environment . Como antes, asegúrese de transmitir un mensaje WM_SETTINGCHANGE
.
Debería poder hacer esto desde su aplicación Java con la suficiente facilidad usando las clases de registro JNI.
Puedes usar:
setx PATH "%PATH%;C://Something//bin"
Sin embargo, setx
truncará la cadena almacenada a 1024 bytes, lo que podría dañar la RUTA.
/M
cambiará la PATH
en HKEY_LOCAL_MACHINE
en lugar de HKEY_CURRENT_USER
. En otras palabras, una variable del sistema, en lugar de la del usuario. Por ejemplo:
SETX /M PATH "%PATH%;C:/your path with spaces"
Debe tener en cuenta que la nueva RUTA no es visible en su cmd.exe
actual.
Pero si busca en el registro o en un nuevo cmd.exe
con "set p"
, puede ver el nuevo valor.