¿Cómo puedo agregar permanentemente una entrada en la variable PATH del sistema, a través de la línea de comando?

13

Lo que necesito hacer:

  • Agregue una carpeta a la %PATH%variable de entorno a nivel de SISTEMA.
  • Haz el cambio permanente.

Cómo necesito hacerlo:

  • Usando el símbolo del sistema u otro método por el cual todos los comandos necesarios se pueden escribir en un .BATarchivo.
  • Usando solo herramientas que estarían disponibles en una instalación simple de Windows XP SP3, sin conectividad a Internet.
  • Prefiero ejecutar el script localmente, pero también tengo acceso remoto a los sistemas de destino. Sin embargo, tenga en cuenta que no puedo suponer que los servicios no predeterminados (es decir: Registro remoto) estén habilitados en los sistemas.

Sistemas en los que el script necesita trabajar:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Estoy bastante familiarizado con el SETcomando, pero también soy consciente de que generalmente sobrescribirá la variable existente en lugar de agregarla. Eso no es aceptable. ¿Hay SETalguna otra herramienta (u opción para la que no tenga conocimiento) que se agregará a la variable? O, ¿necesito poner una solución alternativa en el script que incluya copiar temporalmente la variable existente a otra variable o archivo de texto?

Además, tengo entendido que SETno alterará permanentemente la variable. He visto mención de SETXeso, pero eso no parece estar integrado en Windows XP SP3 (o, al menos, no parece estar disponible en el sistema en el que estoy trabajando). ¿Hay otra forma de hacer que el cambio sea permanente, mediante la edición del registro o algo así?

He echado un vistazo y he aprendido un poco sobre cómo configurar variables de entorno en Windows. Sin embargo, todavía no he encontrado una pregunta duplicada exacta que se ajuste a mis necesidades. Si hay uno, por favor hágamelo saber.

Iszi
fuente
Setx no viene con XP. Está en uno o más de los kits de recursos, pero olvido cuál de las manos. Para hacer cambios permanentes en las variables de entorno en la línea de comando, definitivamente es la forma más fácil. Puede realizar el cambio en el registro (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment) pero los cambios en el registro desde la línea de comandos tampoco son pan comido. Si yo fuera usted, entonces escribiría un VBScript para hacer esto.
EBGreen
@EBGreen Estoy un poco familiarizado con el uso REGpara hacer cambios en el registro. Si desea publicar eso como respuesta, con sugerencias sobre cómo conservar el camino existente, al menos le daré un voto positivo.
Iszi
1
Creo que, por sugerencia de EBGreen, he descubierto cómo necesito hacerlo. Ahora solo desearía que hubiera una manera de forzar la actualización del registro (y empujar a las variables de entorno) sin reiniciar o volver a cargar Explorer.
Iszi
1
@EBGreen Sí, así es como se ve. Por cierto, si tiene tiempo para descubrir la sintaxis, ¿podría publicar una respuesta real? Prefiero que esto no se convierta en una pregunta con respuesta propia.
Iszi
1
@lszi, deberías responder tu propia pregunta. Una buena respuesta a una buena pregunta es valiosa, incluso cuando la responde usted mismo.
Myrddin Emrys

Respuestas:

4

Lo siguiente agrega 'C: \ bin' a su ruta y luego guarda la nueva ruta en el Registro:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

Solo probé esto en XP SP3, pero también debería funcionar en una versión más nueva.

Supongo que un nuevo usuario que inicia sesión antes de que la máquina se reinicie puede no obtener la nueva ruta.

Harry tiene razón con su comentario sobre% SystemRoot%, si desea conservar estos, primero debe extraer el valor anterior para la ruta del registro:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
Peter Hahndorf
fuente
2
Tenga en cuenta que esto cambiará algunas de las entradas PATH existentes al expandir las referencias de variables de entorno. Por ejemplo, la entrada estándar% SystemRoot% \ system32 se reemplazará con c: \ windows \ system32. Este ejemplo en particular no importa porque SystemRoot es una constante, pero si alguien ha configurado una RUTA con una referencia a una variable de entorno que cambia, la romperá. (Hago esto en algunas de mis computadoras para señalar el directorio bin en el Sun JDK actual.)
Harry Johnston
El nuevo script no funciona como está escrito si la ruta contiene corchetes, por ejemplo, cualquier referencia a Archivos de programa (x86).
Harry Johnston
-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f
luego
fuente
2
Si bien los comandos simples pueden ser útiles, esperamos un poco más de trabajo en nuestras preguntas / respuestas. Por favor explique cómo esto responde la pregunta de los OP.
Ƭᴇcʜιᴇ007