batch-file command-line path environment-variables

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:


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.