batch file - Agregar el directorio actual a la ruta de Windows de forma permanente
batch-file command-line (2)
Estoy tratando de agregar el directorio actual (desde una línea de comandos) a la ruta de Windows de forma permanente, pero tengo serios problemas para implementar esto.
Mi intento inicial fue:
set PATH=%PATH%;%cd%
Sin embargo, esto solo funciona en la sesión actual;
Tan pronto como cierro la ventana de la línea de comandos, la
PATH
entorno
PATH
retiene su valor anterior.
Luego probé:
setx PATH=%PATH%;%cd%
Esto podría funcionar en Windows 7 y 8 de acuerdo con algunas de las respuestas que encontré aquí, pero en Windows 10, el comando
setx
tiene tres formas de trabajar:
Syntax 1:
SETX [/S system [/U [domain/]user [/P [password]]]] var value [/M]
Syntax 2:
SETX [/S system [/U [domain/]user [/P [password]]]] var /K regpath [/M]
Syntax 3:
SETX [/S system [/U [domain/]user [/P [password]]]]
/F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
En pocas palabras, no puedo hacer que funcione:
ERROR: Invalid syntax. Default option is not allowed more than ''2'' time(s).
¿Alguien puede sugerirme cómo completar mi objetivo de la manera más fácil?
Si hay una sintaxis diferente para cada versión de Windows, entonces me complacería obtener esta información también.
¡¡¡Muchas gracias!!!
Como se describe en detalle en la respuesta a
¿Por qué también se agregan otras rutas de carpeta a la RUTA del sistema con SetX y no solo la ruta de carpeta especificada?
no es bueno modificar
la
PATH
del
sistema
o del
usuario
desde un archivo por lotes simplemente sobrescribiendo o agregando una ruta de carpeta a la
PATH
almacenada en el registro utilizando la
PATH
local
.
Una solución para esta tarea de agregar la ruta actual del directorio a
la
PATH
usuario
es usar este código en Windows Vista o versiones posteriores de Windows:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=2 tokens=1,2*" %%N in (''%SystemRoot%/System32/reg.exe query "HKEY_CURRENT_USER/Environment" /v "Path" 2^>nul'') do (
if /I "%%N" == "Path" (
set "UserPath=%%P"
if defined UserPath goto CheckPath
)
)
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%/System32/setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%/System32/setx.exe Path "%CD%" >nul
) else (
%SystemRoot%/System32/reg.exe ADD "HKCU/Environment" /f /v Path /t REG_SZ /d "%CD%" >nul
)
endlocal
goto :EOF
:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
set "PathCheck=!UserPath!%Separator%"
if "!PathCheck:%CD%;=!" == "!PathCheck!" (
set "PathToSet=!UserPath!%Separator%%CD%"
set "UseSetx=1"
if not "!PathToSet:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%/System32/setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%/System32/setx.exe Path "!PathToSet!" >nul
) else (
set "ValueType=REG_EXPAND_SZ"
if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"
%SystemRoot%/System32/reg.exe ADD "HKCU/Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul
)
)
endlocal
endlocal
La desventaja de esta solución es que
la
PATH
usuario
es, por ejemplo,
C:/Temp;C:/Temp/Other Folder;C:/Temp/One More Folder
cuando el directorio actual es primero
C:/Temp
, en la próxima ejecución del lote archivo
C:/Temp/Other Folder
y
C:/Temp/One More Folder
en la tercera ejecución del archivo por lotes.
La solución para evitar esto es una definición de una variable de entorno específica de la aplicación llamada en el siguiente archivo por lotes
MyAppPath
que siempre se sobrescribe al ejecutar el archivo por lotes.
Al
usuario
PATH
se agrega solo la referencia a la variable de entorno
MyAppPath
si aún no existe en el
usuario
PATH
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%/System32/setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%/System32/setx.exe MyAppPath "%CD%" >nul
) else (
%SystemRoot%/System32/reg.exe ADD "HKCU/Environment" /f /v MyAppPath /t REG_SZ /d "%CD%" >nul
)
set "UserPath="
for /F "skip=2 tokens=1,2*" %%N in (''%SystemRoot%/System32/reg.exe query "HKEY_CURRENT_USER/Environment" /v "Path" 2^>nul'') do (
if /I "%%N" == "Path" (
set "UserPath=%%P"
if defined UserPath goto CheckPath
)
)
if exist %SystemRoot%/System32/setx.exe (
%SystemRoot%/System32/setx.exe Path "%%MyAppPath%%" >nul
) else (
%SystemRoot%/System32/reg.exe ADD "HKCU/Environment" /f /v Path /t REG_EXPAND_SZ /d "%%MyAppPath%%" >nul
)
endlocal
goto :EOF
:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
if "!UserPath:%%MyAppPath%%=!" == "!UserPath!" (
set "PathToSet=!UserPath!%Separator%%%MyAppPath%%"
set "UseSetx=1"
if not "!PathToSet:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%/System32/setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%/System32/setx.exe Path "!PathToSet!" >nul
) else (
%SystemRoot%/System32/reg.exe ADD "HKCU/Environment" /f /v Path /t REG_EXPAND_SZ /d "!PathToSet!" >nul
)
)
endlocal
endlocal
En este caso,
la
PATH
usuario
tal como está almacenada en el registro contiene siempre solo
%MyAppPath%
y el valor del registro es del tipo
REG_EXPAND_SZ
.
El valor de la variable de entorno
MyAppPath
también se almacena en el registro, pero es del tipo
REG_SZ
.
El valor de
MyAppPath
se actualiza a la ruta actual del directorio en cada ejecución del archivo por lotes.
Por lo tanto, la
PATH
del
usuario
en el registro no se alarga cada vez más en cada ejecución de un archivo por lotes desde una carpeta diferente que antes.
En general, una aplicación o conjunto de aplicaciones no está bien codificado si su carpeta de aplicaciones o una de sus subcarpetas deben estar en
la
PATH
local
al ejecutar la aplicación o cualquier aplicación del conjunto para que funcione correctamente.
La aplicación o el conjunto de aplicaciones puede almacenar su ruta de instalación también en otro lugar del registro, como
App Paths
o en un archivo en una subcarpeta de
%APPDATA%
(ruta de datos de aplicación estándar relacionada con la cuenta de usuario) desde la que se puede leer en la próxima ejecución.
Un paquete instalador debe modificar
la
PATH
usuario
o del
sistema
solo si esta aplicación es ejecutada principalmente por un usuario dentro de una ventana de símbolo del sistema.
Para comprender los comandos utilizados y cómo funcionan, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea con cuidado todas las páginas de ayuda que se muestran para cada comando.
-
echo /?
-
endlocal /?
-
for /?
-
goto /?
-
if /?
-
reg /?
-
reg add /?
-
reg query /?
-
set /?
-
setlocal /?
-
setx /?
Lo siguiente también debe leerse:
- Artículo de Wikipedia sobre las variables de entorno de Windows .
-
Artículo de Microsoft sobre el
uso de operadores de redirección de comandos
explicando
>nul
. -
Responda en
¿Dónde está "START" buscando ejecutables?
con detalles sobre las
App Paths
. -
Respuesta sobre
¿Cuál es la razón por la cual "X no se reconoce como un comando interno o externo, programa operativo o archivo por lotes"?
con detalles sobre
PATH
local , del sistema y del usuario . - Responda en ¿Cómo configurar la variable de entorno PATH en el archivo por lotes solo una vez en Windows?
- Respuesta sobre ¿Cómo puedo usar un archivo .bat para eliminar tokens específicos de la variable de entorno PATH?
Solución simple:
La sintaxis de
setx
es ligeramente diferente de la sintaxis de
set
.
Con
set
, haría:
set PATH=%PATH%;%cd%
Con
setx
, necesitaba hacer:
setx PATH "%cd"
El primer argumento especifica el nombre de la variable de entorno.
El segundo argumento especifica el valor para agregar a esta variable.
Las comillas dobles son necesarias para cuando el segundo argumento contiene espacios.
Este también podría ser el caso con
set
, por cierto.