CMD: ¿Agregar a la ruta sin duplicarla?


12

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

Hacerlo en un archivo por lotes no considera si la ruta personalizada ya está incluida. ¿Cómo evito duplicarlo (es decir, verificar si ya está contenido en la "cadena" de la RUTA)?

Observaciones:

  1. Relacionado: ¿Cómo agrego variables de entorno definidas por el usuario a la variable de sistema PATH en Windows 7?
  2. Relacionado: ¿Cómo puedo agregar permanentemente una entrada en la variable PATH del sistema, a través de la línea de comando?
  3. La 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

Cabe señalar que, en este contexto, la duplicación es inofensiva. Probablemente sería más sensato permitir que ocurra la duplicación que tratar de evitarla e introducir el riesgo de un falso positivo.
Harry Johnston

Respuestas:


14

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

%np%es su nuevo camino, por supuesto, puede usar literales en su lugar. Qué hace: echo %path%|find /i "%np%">nulbusca una ruta existente para una cadena, descartando la salida. ||significa ejecutar en caso de error, por lo que significa: Buscar ruta para agregar cadena y, si no se encuentra, agregarla.

Editar: generalmente no es necesario citar rutas, incluso aquellos que contienen espacios, pero si desea citarlos , esta versión funcionará con rutas dobles:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

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


Bien, sabía que había una forma más limpia de hacer eso ... todavía prefiero bash, pero solo soy yo: D ¡Gracias por la ayuda!
MaddHacker

Bien, pero ¿funciona con espacios en el camino? Lo probé con mis rutas particulares, la "citada y con espacios" se vuelve a agregar. Uno acaba de citar pero no parece haber espacios disponibles.
Horst Walter

1
@HorstWalter Sí, debería funcionar con cualquier ruta (acabo de comprobar con algunos espacios incluidos). ¿Qué quieres decir con "citado"? No necesita utilizar comillas en las rutas, incluso aquellas que contienen espacios. Si %np%contiene citas, sí, hará que se comporte mal.
wmz

2
@HorstWalter Ver mi edición. Esto es solo un problema si usa variables, usar literales (como en echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") debería funcionar bien.
wmz

1
@wmz echo d\. | findstr /c:"d\."falla, pero echo d\. | find "d\."tiene éxito
Restablece a Monica el

4

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

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

donde %checkstr%está la cadena para verificar en la RUTA y %newpath%es la nueva RUTA que se agregará a la RUTA actual

Espero que ayude, y estoy seguro de que hay una manera más fácil, pero eso debería ser el truco 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

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


2

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.