¿Cómo actualizar la variable PATH permanentemente desde cmd? Windows

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 pregunta ).

La documentación sobre cómo hacer esto se puede encontrar en MSDN . El extracto clave es este:

Para agregar o modificar mediante progtwigció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.

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 aquí ).

( 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 )

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 ';' (ie 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/

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 progtwigdor de Delphi de esta página web: http://www.tek-tips.com/viewthread.cfm?qid=686382

TonHu (Progtwigdor) 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 progtwigs 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

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.

En una red corporativa, donde el usuario tiene acceso limitado y usa aplicaciones portátiles, existen estos trucos de línea de comando:

  1. 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.
  2. 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 . Use REG_EXPAND_SZ para las rutas que contienen otras variables %%.
  3. Eliminar la variable env existente: reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir .
    Intereting Posts