CMD: ¿Agregar a la ruta sin duplicarla?

CMD: ¿Agregar a la ruta sin duplicarla?

Para una CMDsesión puedo establecer fácilmente una nueva ruta:SET PATH=%PATH%;"insert custom path here"

Al hacerlo en un archivo por lotes, no se tiene en cuenta si la ruta personalizada ya está incluida. ¿Cómo evito duplicarlo (es decir, comprobar si ya está contenido en la "cadena" de RUTA)?

Observaciones:

  1. Relacionado:¿Cómo agrego variables de entorno definidas por el usuario a la variable del sistema PATH en Windows 7?
  2. Relacionado:¿Cómo puedo agregar permanentemente una entrada a la variable PATH del sistema, a través de la línea de comando?
  3. Misma pregunta para UNIX:Agregue el directorio a $PATH si aún no está allí
  4. Algunas operaciones de cadena "CMD" explicadas:http://ss64.com/nt/syntax-replace.html

Respuesta1

Similar a la respuesta de MaddHackers, pero más compacto.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%es tu nueva ruta, por supuesto que puedes usar literales en su lugar. Qué hace: echo %path%|find /i "%np%">nulbusca una cadena en la ruta existente y descarta la salida. ||significa ejecutar en caso de falla, por lo que significa: Busque la ruta para la cadena que se agregará y, si no la encuentra, agréguela.

Editar: generalmente no es necesario citar rutas, ni siquiera aquellas que contienen espacios, perosi quieres citarlos, esta versión funcionará con rutas entre comillas dobles:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Editar: cambiado findstr /i /c:a find /iya que findstrpuede malinterpretar algunas secuencias como lo señaló KubaOber en los comentarios

Respuesta2

Sé que está sucio, pero esto debería funcionar:

 SET PATH=$(echo $PATH | awk -F"%checkstr%" '{ print ($(NF-1) ~ 0) ? $PATH:%newpath% : $PATH; }')

¿Dónde %checkstr%está la cadena que se debe verificar en la RUTA y %newpath%es la nueva RUTA que se agregará a la RUTA actual?

Espero que eso ayude, y estoy seguro de que hay una manera más fácil, pero debería funcionar por ahora.

EDITAR

Entonces, si no desea agregar las herramientas UNIX a Windows, puede probar esta sintaxis por lotes:

echo %PATH% | find /C /I "<string to find>" > out.txt 
set /p dne= < out.txt
if 0 EQU %dne% (set PATH=%PATH%;"<custom path>")
del out.txt

Uf, no es más bonito, y se puede hacer como una línea si puede hacer que el comando de búsqueda con canalización funcione como un subcomando en la declaración if...

Respuesta3

Script basado en la respuesta de "wmz":

@ECHO off
ECHO java_home=%JAVA_HOME%
SET javapath=%JAVA_HOME%\bin
ECHO %path%|findstr /i /c:"%javapath:"=%">nul || set path=%path%;%javapath%
ECHO Path=%path%
PAUSE

Respuesta4

Respuesta actualizada para 2021:

setya no funciona y necesitamos usar setx(sintaxis ligeramente diferente):

SET mypath=C:\dev\vendor\sass\1.32.4
ECHO %Path%|findstr /i /c:"%mypath:"=%">nul || setx Path "%Path%";%mypath%

información relacionada