variable restaurar modificar java_home entorno crear configurar windows path environment-variables executable

restaurar - ¿Cómo se evita sobrepoblar la variable de entorno PATH en Windows?



variable path windows 10 (12)

Me gustaría saber cuáles son los enfoques que usa para administrar los ejecutables en su sistema. Por ejemplo, tengo casi todo accesible a través de la línea de comandos, pero ahora llego al límite de la cadena de ruta, por lo que no puedo agregar más dir.

Entonces, ¿qué me recomienda? Hace mucho tiempo, traté de usar softLinks de los ejecutables en un Dir que pertenecía a la ruta, pero ese enfoque no funcionó. Lanza el "ejecutable solamente" a un directorio conocido, tiene los problemas que casi cualquier aplicación requiere un conjunto de archivos, por lo que también es malo. Tirar el ejecutable y todos sus archivos a un Dir conocido, mmm esto funcionará, pero la posibilidad de obtener un conflicto en el nombre de los archivos es muy alta. Crear un HardLink? no lo sé. ¿Qué piensas?


Crear una carpeta c: / bin agregando a su ruta y hardlinking como dijo podría acortar la cadena. Tal vez agregue una variable pf a los valores del sistema con valor c: / Archivos de programa luego reemplace c: / Archivos de programa con% pf% en la ruta.

Editar:

Crea una unidad virtual. subst p: "c: / archivos de programa"


En caso de que alguien esté interesado ...

Encuentro que nunca necesito todas esas rutas a la vez, así que creo un montón de archivos de lotes de "inicialización" que modifican la ruta en consecuencia.

Por ejemplo, si quisiera hacer algún desarrollo de C ++ en Eclipse, lo haría:

> initmingw > initeclipse > eclipse

Esto también es útil para evitar conflictos entre ejecutables con el mismo nombre (como los compiladores C ++ y D, que tienen un make.exe).

Mis archivos de proceso por lotes generalmente se ven así:

@echo off set PATH=C:/Path/To/My/Stuff1;%PATH% set PATH=C:/Path/To/My/Stuff2;%PATH%

Encuentro que este enfoque es relativamente limpio y aún no me he encontrado con ningún problema.


En general, no tengo que preocuparme por esto (no he encontrado un límite de tamaño de ruta, ni siquiera sé qué es eso en los sistemas Windows modernos), pero esto es lo que podría hacer para evitar poner el directorio de un programa en el camino:

  • la mayoría de las utilidades de línea de comandos se lanzan a un directorio c:/util que está en la ruta
  • de lo contrario, agregaré un archivo simple cmd / batch al directorio c:/util que se parece a algo así:

    @"c:/program files/whereever/foo.exe" %*

que esencialmente crea un alias para el comando. No es necesariamente perfecto. Algunos programas realmente insisten en estar en el camino (eso es bastante raro hoy en día), y otros programas que intentan invocarlo pueden no encontrarlo correctamente. Pero para la mayoría de los usos funciona bien.

Pero, en general, no tuve que preocuparme por evitar agregar directorios a la ruta.


Escribí y uso constantemente un programa estándar de transmisión (stdin / stderr / stdout) y código de salida PROXY (llamado dispatcher https://github.com/131/dispatcher )

Todos los programas CLI que uso (node, php, python, git, svn, rsync, plink ...) que estoy usando son en realidad el mismo archivo exe (alrededor de 10kb, que solo nombro de manera diferente), que puse en el mismo directorio. Un archivo de texto estático claro simulado hace el "nombre del archivo proxy al mapeo real exe".

El despachador utiliza la API Win32 de administración de procesos de bajo nivel para ser absolutamente transparente.

Usando este software, solo tengo un directorio adicional establecido en mi PATH para todos los programas que pueda usar.


Esto analizará su variable de entorno% PATH% y convertirá cada directorio a su equivalente de nombre corto y luego volverá a unir todo:

@echo off SET MyPath=%PATH% echo %MyPath% echo -- setlocal EnableDelayedExpansion SET TempPath="%MyPath:;=";"%" SET var= FOR %%a IN (%TempPath%) DO ( IF exist %%~sa ( SET "var=!var!;%%~sa" ) ELSE ( echo %%a does not exist ) ) echo -- echo !var:~1!

Tome la salida y actualice la variable PATH en variables de entorno.


Las soluciones anteriores solo funcionan si puede recortar su camino. En mi caso, esa no era realmente una opción, y era una molestia tener que ejecutar un script cada vez que abría un símbolo del sistema. Así que escribí un script simple que se ejecuta automáticamente al abrir el símbolo del sistema, y ​​agrega los contenidos de un archivo de texto a su ruta.

También hay algunos contextos donde ejecutar este script rompe cosas (por ejemplo, en un shell github o cygwin), así que también agregué un archivo que contiene una lista de rutas que, si el símbolo del sistema se inicia en ellas, la variable de ruta isn No cambió a través del script de inicio que normalmente actualiza la ruta.

@echo off :: Modify these to the actual paths of these two files set dontSetupFile=C:/Users/Yams/Dontsetup.txt set pathFile=C:/Users/Yams/Path.txt :: Retrieve the current path (for determining whether or not we should append to our path) set curDir=%cd% :: Be done if the current path is listed in the dontSetupFile SetLocal EnableDelayedExpansion for /F "delims=" %%i in (%dontSetupFile%) do ( if "%%i"=="%curDir%" GOTO AllDone ) :: Append the pathFile to our current PATH set pathAppend= for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i) set PATH=%PATH%;%pathAppend% :: The only way to actually modify a command prompt''s path via a batch file is by starting :: up another command prompt window. So we will do this, however, if this script is :: automatically called on startup of any command prompt window, it will infinately :: recurse and bad things will happen. :: If we already ran, we are done if "%yams%"=="onion" GOTO AllDone :: Otherwise, flag that we just ran, and then start up a new command prompt window :: with this flag set set yams=onion cmd /K set PATH=%PATH%; :: When that command prompt exits, it will load back up this command prompt window, and :: then the user will need to exit out of this as well. This causes this window to :: automatically exit once the cmd it just spawned is closed. exit() :: Path is set up, we are done! :AllDone @echo on

Y Path.txt se verá algo así como

C:/Program Files (x86)/Google/google_appengine; C:/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static; C:/Program Files (x86)/NVIDIA Corporation/PhysX/Common; C:/Program Files/Microsoft SQL Server/110/Tools/Binn; C:/Program Files/Microsoft DNX/Dnvm; C:/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit;

Si bien Dontsetup.txt se verá algo así como

C:/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit C:/Program Files (x86)/Git/cmd C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin

Para hacer que esto se ejecute automáticamente al inicio, abra regedit, navegue hasta HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Command Processor, luego haga clic con el botón secundario a la derecha y presione nuevo -> Valor de cadenas múltiples. Llámalo AutoRun. Establecer su valor para

C:/Users/Yams/setUpPath.bat

o en cualquier otro lugar donde haya almacenado el archivo por lotes anterior.


No lo intenté, ¿pero dividiré el TRAYECTORIO de PATH en partes y me uniré en el trabajo final variable?

Ejemplo inicialmente digamos que tienes algo así como

PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}

En cambio, creas:

_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char} _PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N} rem // may be more parts PATH = %_PATH1%;%_PATH2%


Otra idea: utilice DIR / X para determinar los nombres cortos generados para nombres de archivo que no sean 8dot3. Luego, use estos en su% PATH%.

Por ejemplo, ''C: / Archivos de programa'' se convierte en ''C: / PROGRA ~ 1''.


Sigo estos pasos para que las entradas sean manejables:

  1. Se crearon diferentes usuarios para diferentes combinaciones de uso de paquetes de software. Ejemplo: (a) creado un usuario web para poner a disposición todo el software de desarrollo web; (b) Creó una base de datos de usuarios para poner a disposición todos los paquetes de software de bases de datos y almacenamiento de datos. Recuerde que algunos programas pueden crear más de una entrada. O alguna vez rompo esto en Oracle específico y específico de MSSQL y usuarios específicos de Oracle. Puse MySQL / PostgreSQL, tomcat, wamp, xamp todo en la cuenta de usuario webr.

  2. Si es posible, instale paquetes comunes como office, photoshop, .. como sistema específico disponible para todos los usuarios y paquetes especiales como específicos del usuario. Por supuesto, tuve que iniciar sesión en diferentes usuarios e instalarlos. No todo el software puede proporcionar esta opción. Si la opción "instalar solo para este usuario" no está disponible, instálela para todo el sistema.

  3. Evito instalar programas en la carpeta Archivo de programa (x86) o en el Archivo de programa. Siempre lo instalo en el directorio base. Por ejemplo, MySQL 64 bit va a "C: / mysql64" y MySQL 32 bit va a la carpeta "C: / mysql". Siempre asumo que agrega un sufijo 64 solo para el software de 64 bits. Si no hay sufijo, entonces es un 32 bit. Sigo lo mismo con Java y otros. De esta forma, mi ruta será más corta, sin incluir "C: / Program File (x86)". Para algunos programas, el archivo de configuración puede necesitar ser editado para mostrar exactamente dónde está el archivo .exe. Solo el programa que exija instalarse en "C: / Program File (x86)" se instalará en esa carpeta. Siempre recuerdo acortar los nombres. Evito el número de versión como tomcat / release / version-2.5.0.3 tales detalles. Si necesito la versión conocida, creo un archivo por su versión y lo coloco en la carpeta de tomcat. En general acortar el enlace tanto como sea posible.

  4. Incluya cualquier lote para reemplazar el enlace abreviado a la ruta, si todos los pasos anteriores superaron el límite de Windows.

A continuación, inicie sesión en el usuario específico de uso (aplicación móvil, base de datos / almacenamiento de datos o desarrollo web ...) y realice las tareas pertinentes.

También puede crear ventanas virtuales dentro de Windows. Siempre que tenga una copia del sistema operativo con licencia, es posible crear varias ventanas virtuales con la misma clave. Puede colocar paquetes específicos para una tarea particular en esa máquina. Tienes que iniciar VM por separado cada vez. Algunos paquetes con gran cantidad de memoria, como los fabricantes de películas de animación en 3D, deben colocarse en la máquina principal, no en la VM, ya que la VM solo tendrá una parte de la RAM disponible para su uso. Sin embargo, es un dolor arrancar cada VM.


Una forma en que puedo pensar es utilizar otras variables de entorno para almacenar rutas parciales; por ejemplo, si tienes

C:/this_is_a/long_path/that_appears/in_multiple_places/subdir1; C:/this_is_a/long_path/that_appears/in_multiple_places/subdir2;

entonces puedes crear una nueva variable de entorno como

SET P1=C:/this_is_a/long_path/that_appears/in_multiple_places

después de lo cual tus caminos originales se vuelven

%P1%/subdir1; %P1%/subdir2;

EDITAR: Otra opción es crear un directorio bin que contenga archivos .bat que apuntan a los archivos .exe apropiados.

EDIT 2: El comentario de Ben Voigt a otra respuesta menciona que el uso de otras variables de entorno como se sugiere podría no reducir la duración de %PATH% porque se ampliarían antes de almacenarse. Esto puede ser cierto y no lo he probado. Otra opción es usar formularios 8dot3 para nombres de directorios más largos, por ejemplo C:/Program Files es típicamente equivalente a C:/PROGRA~1 . Puede usar dir /x para ver los nombres más cortos.

EDIT 3: Esta simple prueba me lleva a creer que Ben Voigt tiene razón.

set test1=hello set test2=%test1%hello set test1=bye echo %test2%

Al final de esto, verá salida hellohello lugar de byehello .

EDIT 4: en caso de que decida usar archivos de proceso por lotes para eliminar ciertas rutas de %PATH% , puede que le preocupe cómo pasar los argumentos de su archivo por lotes a su ejecutable, de modo que el proceso sea transparente (es decir, no lo hará). observe cualquier diferencia entre llamar al archivo por lotes y llamar al ejecutable). No tengo mucha experiencia escribiendo archivos por lotes, pero parece que funciona bien.

@echo off rem This batch file points to an executable of the same name rem that is located in another directory. Specify the directory rem here: set actualdir=c:/this_is/an_example_path rem You do not need to change anything that follows. set actualfile=%0 set args=%1 :beginloop if "%1" == "" goto endloop shift set args=%args% %1 goto beginloop :endloop %actualdir%/%actualfile% %args%

Como regla general, debe tener cuidado con la ejecución de archivos por lotes desde Internet, ya que puede hacer todo tipo de cosas con archivos por lotes, como formatear su disco duro. Si no confía en el código anterior (que escribí), puede probarlo reemplazando la línea

%actualdir%/%actualfile% %args%

con

echo %actualdir%/%actualfile% %args%

Lo ideal es que sepas exactamente qué hace cada línea antes de ejecutarla.



si usa Windows Vista o una versión superior, puede crear un enlace simbólico a la carpeta. por ejemplo:

mklink /d C:/pf "C:/Program Files"

haría un enlace para que c:/pf sería su carpeta de program files . Eliminé 300 caracteres de mi camino usando este truco.