Agregue un directorio y todos los subdirectorios a la variable PATH con una sola entrada

19

Tengo un directorio en mi carpeta de inicio en el que coloco el software de línea de comandos (CMD_Software). Puse cada pieza de software en su propio directorio dentro de CMD_Software para evitar el desorden.

Me gustaría hacer una sola entrada en mi variable PATH que permita el acceso a CMD_Software y a todos los directorios que contiene desde la línea de comandos.

Lo intenté C:\Users\myuser\CMD_Software\*pero eso no hizo nada. Ese es el punto en el que me quedé sin ideas.

Tenga en cuenta que no estoy tratando de establecer una nueva ruta mientras estoy en la terminal, estoy tratando de establecer una nueva ruta en las "Variables de entorno" disponibles en la pestaña "Avanzado" de Propiedades del sistema.

Landon Brainard
fuente
¿Intentó algo como `C: \ Users \ myuser \ CMD_Software *`?
terdon
44
No creo que esto sea posible.
Harry Johnston

Respuestas:

16

La variable PATH no admite comodines ni recursividad. Esto es por diseño.

Hay dos posibles soluciones que he usado ocasionalmente:

  • Cree un directorio con archivos por lotes simples y agregue ese directorio a la RUTA. Cada archivo por lotes puede iniciar el programa que desee, por ejemplo:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    La primera línea es un comentario, la segunda comienza @para evitar mostrar el comando que se está ejecutando y %*se usa para pasar cualquier argumento de la línea de comando al EXE.

  • Agregue alias a CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Esto se traduce esencialmente CMD_Softwareen el símbolo del sistema a todo después del signo igual. El $*se reemplaza con los argumentos suministrados.

Prefiero el segundo enfoque, porque puede agrupar todos los alias en un solo archivo (vea el modificador "/ MACROFILE" en DOSKEY /?) Y ejecutarlo automáticamente cada vez que el intérprete de comandos comience a usar una configuración de registro (vea la tecla "AutoRun" en CMD /?).

Un inconveniente del segundo método es que los alias funcionan solo al comienzo de una línea de comando. Esto puede ser un problema si desea encadenar comandos. Por ejemplo, CLS & CMD_Softwareno funcionará a menos que coloque el alias en una línea separada usando paréntesis:

CLS & (
CMD_Software
)

Cada vez que esto se convierte en un problema, simplemente recurro al enfoque de archivo por lotes.

efotinis
fuente
¡Gracias! El primer método funciona muy bien para mí, principalmente porque no tengo que meterme con el registro cuando transfiero mis datos entre computadoras. También es bastante ordenado y conveniente, ya que solo ha dedicado un poco más de tiempo para crear un archivo bat cuando obtiene dicha utilidad.
cyqsimon
Lamentablemente, tengo que redactar mi declaración anterior tan rápido. He encontrado problemas extraños con los scripts que salen aleatoriamente a la mitad de la ejecución después de adoptar el primer método. En particular, wget para Windows parece disfrutar matando mi script después de que haya terminado de descargarse. He desperdiciado las últimas dos horas solucionando problemas con mi script, pero finalmente intenté tirar todos los exes en un solo directorio raíz, y los problemas desaparecieron. Por lo tanto, le recomiendo encarecidamente que tenga precaución antes de que alguien entre en este método.
cyqsimon
4

Esto es lo que uso para solucionar el problema. Copie este script a continuación y guárdelo como FIXPATH.BATen la carpeta que ha agregado a la PATHvariable de entorno. Por ejemplo:

C: \ Users \ myuser \ CMD_Software \

Ahora, cada vez que necesite ejecutar un programa que esté en una subcarpeta, diga ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
o
C: \ Users \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Ejecutar fixpathprimero y luego introducir el comando (por ejemplo, grepo exiftool) de esta manera:

Microsoft Windows [Versión 6.3.9600]
(c) 2013 Microsoft Corporation. Todos los derechos reservados.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

para / R %% d en (.) do (
    establecer "dirs =! dirs!; %% d"
)

ruta =% ruta%! dirs!
(endlocal
    establecer "ret =% PATH%"
)
cmd / K "título [#] Ruta fijada [#] && ruta% ret%"
salida / B

Gracias a la respuesta de @ VonC

Vinayak
fuente
1

Coloque un subdirectorio "programlinks \" debajo de ... \ CMD_Software (o en cualquier lugar, en realidad) y complételo con enlaces simbólicos o hardlinks a cada ejecutable al que desee acceder. Entonces una sola entrada en la RUTA para ... \ programlinks será suficiente.

kreemoweet
fuente
1
El principal problema con eso es que si hay bibliotecas de las que depende el ejecutable ubicadas potencialmente en el mismo directorio que el exe, no se usarán. O al menos eso es lo que sucede con mi intento con esto.
zero298
Gran comentario, @ zero298. Aunque me gustaría, si alguien está 100% seguro y puede confirmar que esto es realmente cierto, por favor intervenga. (Porque este método es el más limpio de todos).
Henrik
-1

Si la idea no le desanima demasiado, puede copiar sus herramientas de línea de comandos en el directorio Windows \ System32. Luego puede ejecutarlos desde cualquier directorio, como ping o ipconfig.

editar
Después de jugar un poco, esto ES posible. Solo necesita usar punto y coma para delimitar sus directorios. Digamos que tenía un programa en "carpeta1" y "carpeta2". Escribirías tu camino así:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Luego puede llamar a un programa en cualquier directorio directamente desde la línea de comandos. AFAIK no hay otra manera de hacer esto con una sola línea.

Información de soporte: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
fuente
1
Esto no tiene mucho sentido. 1. Esto borraría cualquier contenido previo de la variable PATH . 2. La variable PATH solo contendría la carpeta, no sus subdirectorios (resultado deseado). 3. Invocar program.batcomo %PATH%\program.bates más o menos lo contrario de para qué está diseñado PATH.
Dennis