restaurar reiniciar refrescar entorno configurar windows cmd environment-variables

windows - reiniciar - variables de entorno linux



¿Hay un comando para actualizar las variables de entorno desde el símbolo del sistema en Windows? (27)

Si modifico o agrego una variable de entorno, debo reiniciar el símbolo del sistema. ¿Hay algún comando que pueda ejecutar que haría esto sin reiniciar CMD?


El mejor método que se me ocurrió fue hacer una consulta en el Registro. Aquí está mi ejemplo.

En mi ejemplo, hice una instalación utilizando un archivo por lotes que agregó nuevas variables de entorno. Necesitaba hacer cosas con esto tan pronto como se completara la instalación, pero no pude generar un nuevo proceso con esas nuevas variables. Probé la creación de otra ventana del explorador y volví a llamar a cmd.exe y esto funcionó, pero en Vista y Windows 7, Explorer solo se ejecuta como una sola instancia y normalmente como la persona que inició sesión. Esto fallaría con la automatización ya que necesito mis credenciales de administrador para haga las cosas independientemente de ejecutar desde el sistema local o como administrador en el cuadro. La limitación a esto es que no maneja cosas como la ruta, esto solo funcionó en variables de entorno simples. Esto me permitió usar un lote para ir a un directorio (con espacios) y copiar en archivos ejecutados .exes y etc. Esto fue escrito hoy desde may resources en .com

Llamadas de lote original a lote nuevo:

testenvget.cmd SDROOT (o cualquiera que sea la variable)

@ECHO OFF setlocal ENABLEEXTENSIONS set keyname=HKLM/System/CurrentControlSet/Control/Session Manager/Environment set value=%1 SET ERRKEY=0 REG QUERY "%KEYNAME%" /v "%VALUE%" 2>NUL| FIND /I "%VALUE%" IF %ERRORLEVEL% EQU 0 ( ECHO The Registry Key Exists ) ELSE ( SET ERRKEY=1 Echo The Registry Key Does not Exist ) Echo %ERRKEY% IF %ERRKEY% EQU 1 GOTO :ERROR FOR /F "tokens=1-7" %%A IN (''REG QUERY "%KEYNAME%" /v "%VALUE%" 2^>NUL^| FIND /I "%VALUE%"'') DO ( ECHO %%A ECHO %%B ECHO %%C ECHO %%D ECHO %%E ECHO %%F ECHO %%G SET ValueName=%%A SET ValueType=%%B SET C1=%%C SET C2=%%D SET C3=%%E SET C4=%%F SET C5=%%G ) SET VALUE1=%C1% %C2% %C3% %C4% %C5% echo The Value of %VALUE% is %C1% %C2% %C3% %C4% %C5% cd /d "%VALUE1%" pause REM **RUN Extra Commands here** GOTO :EOF :ERROR Echo The the Enviroment Variable does not exist. pause GOTO :EOF

También hay otro método que se me ocurrió a partir de varias ideas diferentes. Por favor ver más abajo. Básicamente, esto obtendrá la variable de ruta más nueva del registro; sin embargo, esto causará una serie de problemas porque la consulta del registro dará variables en sí mismas, lo que significa que en todas partes hay una variable que no funcionará, así que para combatir este problema Básicamente doble el camino. Muy asqueroso. El método más preferido sería hacer: Establecer ruta =% Ruta%; C: / Archivos de programa / Software .... /

Independientemente de que aquí esté el nuevo archivo por lotes, tenga cuidado.

@ECHO OFF SETLOCAL ENABLEEXTENSIONS set org=%PATH% for /f "tokens=2*" %%A in (''REG QUERY "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" /v Path ^|FIND /I "Path"'') DO ( SET path=%%B ) SET PATH=%org%;%PATH% set path


El reinicio del explorador hizo esto por mí, pero solo para los nuevos terminales cmd.

El terminal que configuré la ruta ya podría ver la nueva variable Ruta (en Windows 7).

taskkill /f /im explorer.exe && explorer.exe


En Windows 7/8/10 puede instalar Chocolatey que tiene un script para esto incorporado.

Después de instalar Chocolatey, simplemente escriba "refreshenv" sin comillas.


Encontré esta respuesta antes de encontrar una solución más fácil.

Simplemente reinicie explorer.exe en el Administrador de tareas.

No hice la prueba, pero es posible que también deba volver a abrir el indicador de comando.

Crédito a Timo Huovinen aquí: No se reconoció el nodo aunque se instaló con éxito (si esto te ayudó, dale crédito al comentario de este hombre).


Es posible hacer esto sobrescribiendo la Tabla de entorno dentro de un proceso específico.

Como prueba de concepto, escribí esta aplicación de muestra, que acaba de editar una única variable de entorno (conocida) en un proceso cmd.exe:

typedef DWORD (__stdcall *NtQueryInformationProcessPtr)(HANDLE, DWORD, PVOID, ULONG, PULONG); int __cdecl main(int argc, char* argv[]) { HMODULE hNtDll = GetModuleHandleA("ntdll.dll"); NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hNtDll, "NtQueryInformationProcess"); int processId = atoi(argv[1]); printf("Target PID: %u/n", processId); // open the process with read+write access HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, 0, processId); if(hProcess == NULL) { printf("Error opening process (%u)/n", GetLastError()); return 0; } // find the location of the PEB PROCESS_BASIC_INFORMATION pbi = {0}; NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL); if(status != 0) { printf("Error ProcessBasicInformation (0x%8X)/n", status); } printf("PEB: %p/n", pbi.PebBaseAddress); // find the process parameters char *processParamsOffset = (char*)pbi.PebBaseAddress + 0x20; // hard coded offset for x64 apps char *processParameters = NULL; if(ReadProcessMemory(hProcess, processParamsOffset, &processParameters, sizeof(processParameters), NULL)) { printf("UserProcessParameters: %p/n", processParameters); } else { printf("Error ReadProcessMemory (%u)/n", GetLastError()); } // find the address to the environment table char *environmentOffset = processParameters + 0x80; // hard coded offset for x64 apps char *environment = NULL; ReadProcessMemory(hProcess, environmentOffset, &environment, sizeof(environment), NULL); printf("environment: %p/n", environment); // copy the environment table into our own memory for scanning wchar_t *localEnvBlock = new wchar_t[64*1024]; ReadProcessMemory(hProcess, environment, localEnvBlock, sizeof(wchar_t)*64*1024, NULL); // find the variable to edit wchar_t *found = NULL; wchar_t *varOffset = localEnvBlock; while(varOffset < localEnvBlock + 64*1024) { if(varOffset[0] == ''/0'') { // we reached the end break; } if(wcsncmp(varOffset, L"ENVTEST=", 8) == 0) { found = varOffset; break; } varOffset += wcslen(varOffset)+1; } // check to see if we found one if(found) { size_t offset = (found - localEnvBlock) * sizeof(wchar_t); printf("Offset: %Iu/n", offset); // write a new version (if the size of the value changes then we have to rewrite the entire block) if(!WriteProcessMemory(hProcess, environment + offset, L"ENVTEST=def", 12*sizeof(wchar_t), NULL)) { printf("Error WriteProcessMemory (%u)/n", GetLastError()); } } // cleanup delete[] localEnvBlock; CloseHandle(hProcess); return 0; }

Salida de muestra:

>set ENVTEST=abc >cppTest.exe 13796 Target PID: 13796 PEB: 000007FFFFFD3000 UserProcessParameters: 00000000004B2F30 environment: 000000000052E700 Offset: 1528 >set ENVTEST ENVTEST=def

Notas

Este enfoque también se limitaría a las restricciones de seguridad. Si el objetivo se ejecuta en una elevación más alta o una cuenta más alta (como SISTEMA), no tendríamos permiso para editar su memoria.

Si quisiera hacer esto en una aplicación de 32 bits, las compensaciones codificadas en el código anterior cambiarían a 0x10 y 0x48 respectivamente. Estas compensaciones se pueden encontrar descargando las estructuras _PEB y _RTL_USER_PROCESS_PARAMETERS en un depurador (por ejemplo, en WinDbg dt _PEB y dt _RTL_USER_PROCESS_PARAMETERS )

Para convertir la prueba de concepto en lo que necesita el OP, solo enumeraría las variables del entorno del usuario y del sistema actual (como las documentadas por la respuesta de @ tsadok) y escribiría la tabla completa del entorno en la memoria del proceso objetivo.

Edición: el tamaño del bloque de entorno también se almacena en la estructura _RTL_USER_PROCESS_PARAMETERS, pero la memoria se asigna en el montón del proceso. Por lo tanto, desde un proceso externo no podríamos redimensionarlo y hacerlo más grande. Jugué con el uso de VirtualAllocEx para asignar memoria adicional en el proceso de destino para el almacenamiento del entorno, y pude configurar y leer una tabla completamente nueva. Desafortunadamente, cualquier intento de modificar el entorno de los medios normales se bloqueará y quemará ya que la dirección ya no apunta al montón (se bloqueará en RtlSizeHeap).


Esto es lo que usa Chocolatey.

https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd

@echo off :: :: RefreshEnv.cmd :: :: Batch file to read environment variables from registry and :: set session variables to these values. :: :: With this batch file, there should be no need to reload command :: environment every time you want environment changes to propagate echo | set /p dummy="Reading environment variables from registry. Please wait... " goto main :: Set one environment variable from registry key :SetFromReg "%WinDir%/System32/Reg" QUERY "%~1" /v "%~2" > "%TEMP%/_envset.tmp" 2>NUL for /f "usebackq skip=2 tokens=2,*" %%A IN ("%TEMP%/_envset.tmp") do ( echo/set %~3=%%B ) goto :EOF :: Get a list of environment variables from registry :GetRegEnv "%WinDir%/System32/Reg" QUERY "%~1" > "%TEMP%/_envget.tmp" for /f "usebackq skip=2" %%A IN ("%TEMP%/_envget.tmp") do ( if /I not "%%~A"=="Path" ( call :SetFromReg "%~1" "%%~A" "%%~A" ) ) goto :EOF :main echo/@echo off >"%TEMP%/_env.cmd" :: Slowly generating final file call :GetRegEnv "HKLM/System/CurrentControlSet/Control/Session Manager/Environment" >> "%TEMP%/_env.cmd" call :GetRegEnv "HKCU/Environment">>"%TEMP%/_env.cmd" >> "%TEMP%/_env.cmd" :: Special handling for PATH - mix both User and System call :SetFromReg "HKLM/System/CurrentControlSet/Control/Session Manager/Environment" Path Path_HKLM >> "%TEMP%/_env.cmd" call :SetFromReg "HKCU/Environment" Path Path_HKCU >> "%TEMP%/_env.cmd" :: Caution: do not insert space-chars before >> redirection sign echo/set Path=%%Path_HKLM%%;%%Path_HKCU%% >> "%TEMP%/_env.cmd" :: Cleanup del /f /q "%TEMP%/_envset.tmp" 2>nul del /f /q "%TEMP%/_envget.tmp" 2>nul :: Set these variables call "%TEMP%/_env.cmd" echo | set /p dummy="Done" echo .


Esto funciona en Windows 7: SET PATH=%PATH%;C:/CmdShortcuts

probado escribiendo echo% PATH% y funcionó, bien. También configúralo si abres un nuevo cmd, ya no será necesario reiniciar tan molestos :)


Intente abrir un nuevo símbolo del sistema como administrador. Esto me funcionó en Windows 10. (Sé que esta es una respuesta antigua, pero tuve que compartir esto porque tener que escribir un script VBS solo por esto es absurdo).


La forma más fácil de agregar una variable a la ruta sin reiniciar para la sesión actual es abrir el símbolo del sistema y escribir:

PATH=(VARIABLE);%path%

y presiona enter .

para comprobar si su variable cargada, escriba

PATH

y presiona enter . Sin embargo, la variable solo será parte de la ruta hasta que reinicies.


Las variables de entorno se mantienen en HKEY_LOCAL_MACHINE / SYSTEM / ControlSet / Control / Session Manager / Environment.

Muchas de las variables env útiles, como Path, se almacenan como REG_SZ. Hay varias formas de acceder al registro, incluyendo REGEDIT:

REGEDIT /E &lt;filename&gt; "HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment"

La salida comienza con números mágicos. Entonces, para buscarlo con el comando de búsqueda, debe escribirse y redirigirse: type <filename> | findstr -c:/"Path/" type <filename> | findstr -c:/"Path/"

Por lo tanto, si solo desea actualizar la variable de ruta en su sesión de comando actual con las propiedades del sistema, el siguiente script por lotes funciona bien:

RefreshPath.cmd:

@echo off REM This solution requests elevation in order to read from the registry. if exist %temp%/env.reg del %temp%/env.reg /q /f REGEDIT /E %temp%/env.reg "HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Session Manager/Environment" if not exist %temp%/env.reg ( echo "Unable to write registry to temp location" exit 1 ) SETLOCAL EnableDelayedExpansion for /f "tokens=1,2* delims==" %%i in (''type %temp%/env.reg ^| findstr -c:/"Path/"='') do ( set upath=%%~j echo !upath://=/! >%temp%/newpath ) ENDLOCAL for /f "tokens=*" %%i in (%temp%/newpath) do set path=%%i


Llamar a esta función me ha funcionado:

VOID Win32ForceSettingsChange() { DWORD dwReturnValue; ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue); }


Lo confuso podría ser que hay algunos lugares desde donde iniciar el cmd. En mi caso, ejecuté cmd desde Windows Explorer y las variables de entorno no cambiaron, mientras que al iniciar cmd desde "ejecutar" (tecla de Windows + r) se cambiaron las variables de entorno.

En mi caso, solo tuve que finalizar el proceso de Windows Explorer desde el administrador de tareas y luego reiniciarlo nuevamente desde el administrador de tareas .

Una vez que hice esto, tuve acceso a la nueva variable de entorno desde un cmd que se generó desde Windows Explorer.


Me gustó el enfoque seguido de chocolate, como se publicó en la respuesta de cobarde anónimo, ya que es un enfoque de lotes puros. Sin embargo, deja un archivo temporal y algunas variables temporales por ahí. Hice una versión más limpia para mí.

Haga un archivo refreshEnv.bat algún lugar de su PATH . Actualice su entorno de consola ejecutando refreshEnv .

@ECHO OFF REM Source found on https://github.com/DieterDePaepe/windows-scripts REM Please share any improvements made! REM Code inspired by http://.com/questions/171588/is-there-a-command-to-refresh-environment-variables-from-the-command-prompt-in-w IF [%1]==[/?] GOTO :help IF [%1]==[/help] GOTO :help IF [%1]==[--help] GOTO :help IF [%1]==[] GOTO :main ECHO Unknown command: %1 EXIT /b 1 :help ECHO Refresh the environment variables in the console. ECHO. ECHO refreshEnv Refresh all environment variables. ECHO refreshEnv /? Display this help. GOTO :EOF :main REM Because the environment variables may refer to other variables, we need a 2-step approach. REM One option is to use delayed variable evaluation, but this forces use of SETLOCAL and REM may pose problems for files with an ''!'' in the name. REM The option used here is to create a temporary batch file that will define all the variables. REM Check to make sure we don''t overwrite an actual file. IF EXIST %TEMP%/__refreshEnvironment.bat ( ECHO Environment refresh failed! ECHO. ECHO This script uses a temporary file "%TEMP%/__refreshEnvironment.bat", which already exists. The script was aborted in order to prevent accidental data loss. Delete this file to enable this script. EXIT /b 1 ) REM Read the system environment variables from the registry. FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment"`) DO ( REM /I -> ignore casing, since PATH may also be called Path IF /I NOT [%%I]==[PATH] ( ECHO SET %%I=%%K>>%TEMP%/__refreshEnvironment.bat ) ) REM Read the user environment variables from the registry. FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU/Environment`) DO ( REM /I -> ignore casing, since PATH may also be called Path IF /I NOT [%%I]==[PATH] ( ECHO SET %%I=%%K>>%TEMP%/__refreshEnvironment.bat ) ) REM PATH is a special variable: it is automatically merged based on the values in the REM system and user variables. REM Read the PATH variable from the system and user environment variables. FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" /v PATH`) DO ( ECHO SET PATH=%%K>>%TEMP%/__refreshEnvironment.bat ) FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU/Environment /v PATH`) DO ( ECHO SET PATH=%%PATH%%;%%K>>%TEMP%/__refreshEnvironment.bat ) REM Load the variable definitions from our temporary file. CALL %TEMP%/__refreshEnvironment.bat REM Clean up after ourselves. DEL /Q %TEMP%/__refreshEnvironment.bat ECHO Environment successfully refreshed.


No hay manera directa, como dijo Kev. En la mayoría de los casos, es más fácil generar otra caja CMD. Lo que es más molesto, los programas en ejecución tampoco son conscientes de los cambios (aunque IIRC puede haber un mensaje de difusión para que lo notifiquen).

Ha sido peor: en versiones anteriores de Windows, tenía que cerrar sesión y luego volver a iniciarla para tener en cuenta los cambios ...


Por diseño, no hay un mecanismo incorporado para que Windows propague una variable de entorno agregar / cambiar / eliminar a un cmd.exe que ya esté en ejecución, ya sea desde otro cmd.exe o desde "Mi PC -> Propiedades -> Configuración avanzada -> Variables de entorno".

Si modifica o agrega una nueva variable de entorno fuera del alcance de un indicador de comando abierto existente, debe reiniciar el símbolo del sistema o agregar manualmente usando SET en el símbolo del sistema existente.

La última respuesta aceptada muestra una solución parcial al actualizar manualmente todas las variables de entorno en un script. La secuencia de comandos controla el caso de uso de cambiar variables de entorno globalmente en "Mi computadora ... Variables de entorno", pero si se cambia una variable de entorno en un cmd.exe, la secuencia de comandos no la propagará a otra cmd.exe en ejecución.


Primero instale choco:

  • si usa cmd @"%SystemRoot%/System32/WindowsPowerShell/v1.0/powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString(''https://chocolatey.org/install.ps1''))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%/chocolatey/bin"

  • si se utiliza el Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(''https://chocolatey.org/install.ps1'')) Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(''https://chocolatey.org/install.ps1''))

A continuación, puede ejecutar refreshenv . Funciona tanto en cmd como en powershell.


Puede capturar las variables de entorno del sistema con un script vbs, pero necesita un script bat para cambiar realmente las variables de entorno actuales, por lo que esta es una solución combinada.

Cree un archivo llamado resetvars.vbs contenga este código y guárdelo en la ruta:

Set oShell = WScript.CreateObject("WScript.Shell") filename = oShell.ExpandEnvironmentStrings("%TEMP%/resetvars.bat") Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set oFile = objFileSystem.CreateTextFile(filename, TRUE) set oEnv=oShell.Environment("System") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next path = oEnv("PATH") set oEnv=oShell.Environment("User") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next path = path & ";" & oEnv("PATH") oFile.WriteLine("SET PATH=" & path) oFile.Close

cree otro nombre de archivo resetvars.bat que contenga este código, la misma ubicación:

@echo off %~dp0resetvars.vbs call "%TEMP%/resetvars.bat"

Cuando desee actualizar las variables de entorno, simplemente ejecute resetvars.bat

Apologética :

Los dos problemas principales que tuve con esta solución fueron

a. No pude encontrar una forma sencilla de exportar variables de entorno desde un script vbs al símbolo del sistema, y

segundo. La variable de entorno PATH es una concatenación del usuario y las variables PATH del sistema.

No estoy seguro de cuál es la regla general para las variables en conflicto entre el usuario y el sistema, así que elegí hacer que el usuario sustituya el sistema, excepto en la variable PATH que se maneja específicamente.

Utilizo el mecanismo de murcielago vbs + bat + temporal para solucionar el problema de exportar variables de vbs.

Nota : este script no borra las variables.

Esto probablemente se puede mejorar.

ADICIONAL

Si necesita exportar el entorno de una ventana cmd a otra, use este script (llamémoslo exportvars.vbs ):

Set oShell = WScript.CreateObject("WScript.Shell") filename = oShell.ExpandEnvironmentStrings("%TEMP%/resetvars.bat") Set objFileSystem = CreateObject("Scripting.fileSystemObject") Set oFile = objFileSystem.CreateTextFile(filename, TRUE) set oEnv=oShell.Environment("Process") for each sitem in oEnv oFile.WriteLine("SET " & sitem) next oFile.Close

Ejecute exportvars.vbs en la ventana desde la que desea exportar, luego cambie a la ventana a la que desea exportar y escriba:

"%TEMP%/resetvars.bat"


Utilizo el siguiente código en mis scripts por lotes:

if not defined MY_ENV_VAR ( setx MY_ENV_VAR "VALUE" > nul set MY_ENV_VAR=VALUE ) echo %MY_ENV_VAR%

Al usar SET después de SETX es posible usar la variable "local" directamente sin reiniciar la ventana de comandos. Y en la siguiente ejecución, se utilizará la variable de entorno.


solo reinicie explorer.exe >> probado en win 8 X64


Use "setx" y reinicie el indicador de cmd

Hay una herramienta de línea de comandos llamada " setx " para este trabajo. Es para leer y escribir variables env. Las variables persisten después de que la ventana de comando ha sido cerrada.

"Crea o modifica variables de entorno en el usuario o en el entorno del sistema, sin requerir programación o secuencias de comandos. El comando setx también recupera los valores de las claves de registro y las escribe en archivos de texto".

Nota: las variables creadas o modificadas por esta herramienta estarán disponibles en futuras ventanas de comandos, pero no en la ventana de comandos actual de CMD.exe. Por lo tanto, tienes que reiniciar.

Si falta setx :

O modificar el registro

MSDN dice:

Para agregar o modificar las variables de entorno del sistema mediante programación, agréguelas a la clave de registro HKEY_LOCAL_MACHINE / System / CurrentControlSet / Control / Session Manager / Environment , luego transmita un mensaje WM_SETTINGCHANGE con lParam establecido en la cadena " Environment ".

Esto permite que las aplicaciones, como el shell, recojan sus actualizaciones.


Editar: esto solo funciona si los cambios de entorno que está haciendo son como resultado de ejecutar un archivo por lotes.

Si un archivo por lotes comienza, SETLOCALentonces siempre se volverá a desentrañar en su entorno original al salir, incluso si olvida llamar ENDLOCALantes de que salga el lote, o si se cancela inesperadamente.

Casi todos los archivos por lotes con los que escribo comienzan, SETLOCALya que en la mayoría de los casos no quiero que se mantengan los efectos secundarios de los cambios de entorno. En los casos en los que quiero que ciertos cambios de la variable de entorno se propaguen fuera del archivo por lotes, mi último ENDLOCALaspecto es el siguiente:

ENDLOCAL & ( SET RESULT1=%RESULT1% SET RESULT2=%RESULT2% )


O simplemente puede hacerlo manualmente a través de

Para ver o cambiar las variables de entorno: Haga clic con el botón derecho en Mi PC y luego haga clic en Propiedades. Haga clic en la pestaña Avanzado. Haga clic en variables de entorno. Haga clic en una de las siguientes opciones, ya sea para un usuario o una variable del sistema: Haga clic en Nuevo para agregar un nuevo nombre y valor de variable. Haga clic en una variable existente y luego haga clic en Editar para cambiar su nombre o valor. Haga clic en una variable existente y luego haga clic en Eliminar para eliminarla. http://support.microsoft.com/kb/310519

Variables de entorno de Windows XP

%ALLUSERSPROFILE% (%PROGRAMDATA%) C:/Documents and Settings/All Users %APPDATA% C:/Documents and Settings/{username}/Application Data %COMPUTERNAME% {computername} %COMMONPROGRAMFILES% C:/Program Files/Common Files %COMMONPROGRAMFILES(x86)% C:/Program Files (x86)/Common Files %COMSPEC% C:/Windows/System32/cmd.exe %HOMEDRIVE% C: %HOMEPATH% /Documents and Settings/{username} %LOCALAPPDATA% Not available %LOGONSERVER% //{domain_logon_server} %PATH% C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;{plus program paths} %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH %PROGRAMFILES% C:/Program Files %PROGRAMFILES(X86)% C:/Program Files (x86) (only in 64-bit version) %PROMPT% Code for current command prompt format. Code is usually $P$G %SystemDrive% C: %SystemRoot% The Windows directory, usually C:/Windows, formerly C:/WINNT %TEMP% and %TMP% C:/Documents and Settings/{username}/Local Settings/Temp %USERDOMAIN% {userdomain} %USERNAME% {username} %USERPROFILE% C:/Documents and Settings/{username} %WINDIR% C:/Windows %PUBLIC% %PROGRAMDATA% Only available in Windows Vista and newer versions %PSModulePath%

Variables de entorno de Windows 7

%ALLUSERSPROFILE% (%PROGRAMDATA%) C:/ProgramData %APPDATA% C:/Users/{username}/AppData/Roaming %COMPUTERNAME% {computername} %COMMONPROGRAMFILES% C:/Program Files/Common Files %COMMONPROGRAMFILES(x86)% C:/Program Files (x86)/Common Files %COMSPEC% C:/Windows/System32/cmd.exe %HOMEDRIVE% C: %HOMEPATH% /Users/{username} %LOCALAPPDATA% C:/Users/{username}/AppData/Local %LOGONSERVER% //{domain_logon_server} %PATH% C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;{plus program paths} %PATHEXT% .com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc %PROGRAMFILES% C:/Program Files %PROGRAMFILES(X86)% C:/Program Files (x86) (only in 64-bit version) %PROMPT% Code for current command prompt format. Code is usually $P$G %SystemDrive% C: %SystemRoot% C:/Windows %TEMP% and %TMP% C:/Users/{username}/AppData/Local/Temp %USERDOMAIN% {userdomain} %USERNAME% {username} %USERPROFILE% C:/Users/{username} %WINDIR% C:/Windows %PUBLIC% C:/Users/Public %PROGRAMDATA% C:/ProgramData %PSModulePath% %SystemRoot%/system32/WindowsPowerShell/v1.0/Modules/

http://www.binbert.com/blog/2010/09/default-environment-variable-values-of-windows-7-xp/

espero que esto ayude.


No, no lo creo ... aunque puedes configurarlos manualmente. Así que puedes ponerlos en un archivo por lotes o algo así.

probablemente podría hacer una utilidad / script (si alguien no lo ha hecho) que consulte el registro y establezca el entorno actual para que sea el mismo


Para resolver esto, cambié la variable de entorno usando BOTH setx y set, y luego reinicié todas las instancias de explorer.exe. De esta manera cualquier proceso iniciado posteriormente tendrá la nueva variable de entorno.

Mi script por lotes para hacer esto:

setx /M ENVVAR "NEWVALUE" set ENVVAR="NEWVALUE" taskkill /f /IM explorer.exe start explorer.exe >nul exit

El problema con este enfoque es que todas las ventanas de explorador que están abiertas actualmente se cerrarán, lo que probablemente sea una mala idea. Pero vea la publicación de Kev para saber por qué esto es necesario.


Si se trata de solo una (o algunas) vars específicas que desea cambiar, creo que la forma más sencilla es una solución : simplemente instálelo en su entorno Y en su sesión de consola actual.

  • Set pondrá la var en tu sesión actual.
  • SetX pondrá la var en el entorno, pero NO en su sesión actual

Tengo este sencillo script por lotes para cambiar mi Maven de Java7 a Java8 (que son ambas env. Vars) La carpeta por lotes está en mi PATH var, por lo que siempre puedo llamar '' j8 '' y dentro de mi consola y en el entorno mi JAVA_HOME var se cambia

j8.bat:

@echo off set JAVA_HOME=%JAVA_HOME_8% setx JAVA_HOME "%JAVA_HOME_8%"

Hasta ahora encuentro que esto funciona mejor y más fácil. Probablemente quieras que esté en un solo comando, pero simplemente no está en Windows ...


Simplemente escriba "# -r" (sin comillas # con la opción -r) en su terminal. Y todo está configurado a las rutas por defecto :)


Yo uso este script Powershell para agregar a la variable PATH . Con un pequeño ajuste también puede funcionar en su caso, creo.

#REQUIRES -Version 3.0 if (-not ("win32.nativemethods" -as [type])) { # import sendmessagetimeout from win32 add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @" [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessageTimeout( IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult); "@ } $HWND_BROADCAST = [intptr]0xffff; $WM_SETTINGCHANGE = 0x1a; $result = [uintptr]::zero function global:ADD-PATH { [Cmdletbinding()] param ( [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)] [string] $Folder ) # See if a folder variable has been supplied. if (!$Folder -or $Folder -eq "" -or $Folder -eq $null) { throw ''No Folder Supplied. $ENV:PATH Unchanged'' } # Get the current search path from the environment keys in the registry. $oldPath=$(Get-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH).Path # See if the new Folder is already in the path. if ($oldPath | Select-String -SimpleMatch $Folder){ return ''Folder already within $ENV:PATH'' } # Set the New Path and add the ; in front $newPath=$oldPath+'';''+$Folder Set-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH -Value $newPath -ErrorAction Stop # Show our results back to the world return ''This is the new PATH content: ''+$newPath # notify all windows of environment block change [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result) } function global:REMOVE-PATH { [Cmdletbinding()] param ( [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)] [String] $Folder ) # See if a folder variable has been supplied. if (!$Folder -or $Folder -eq "" -or $Folder -eq $NULL) { throw ''No Folder Supplied. $ENV:PATH Unchanged'' } # add a leading ";" if missing if ($Folder[0] -ne ";") { $Folder = ";" + $Folder; } # Get the Current Search Path from the environment keys in the registry $newPath=$(Get-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH).Path # Find the value to remove, replace it with $NULL. If it''s not found, nothing will change and you get a message. if ($newPath -match [regex]::Escape($Folder)) { $newPath=$newPath -replace [regex]::Escape($Folder),$NULL } else { return "The folder you mentioned does not exist in the PATH environment" } # Update the Environment Path Set-ItemProperty -Path ''Registry::HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment'' -Name PATH -Value $newPath -ErrorAction Stop # Show what we just did return ''This is the new PATH content: ''+$newPath # notify all windows of environment block change [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result) } # Use ADD-PATH or REMOVE-PATH accordingly. #Anything to Add? #Anything to Remove? REMOVE-PATH "%_installpath_bin%"