web-dev-qa-db-fra.com

Comment éviter de surcharger la variable d'environnement PATH dans Windows?

J'aimerais savoir quelles sont les approches que vous utilisez pour gérer les exécutables de votre système. Par exemple, j'ai presque tout accessible via la ligne de commande, mais maintenant j'arrive à la limite de la chaîne de chemin d'accès, donc je ne peux pas ajouter d'autre dir.

Alors, que recommandez-vous? Il y a longtemps, j'ai essayé d'utiliser des softLinks des exécutables dans un Dir appartenant au chemin, mais cette approche ne fonctionnait pas . Lancez "l'exécutable seulement" à un Dir connu, a pour problèmes que presque toutes les applications nécessitent un ensemble de fichiers, ce qui est également mauvais . Lancez l’exécutable et tous ses fichiers dans un répertoire connu, cela fonctionnera, mais vous aurez la possibilité d’obtenir un conflit le nom des fichiers est très très élevé . Créer un HardLink? Je ne sais pas. Qu'est-ce que tu penses?

106
mjsr

Une façon dont je peux penser est d’utiliser d’autres variables d’environnement pour stocker des chemins partiels; par exemple, si vous avez

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

alors vous pouvez créer une nouvelle variable d'environnement telle que

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

après quoi vos chemins originaux deviennent

%P1%\subdir1;
%P1%\subdir2;

EDIT: Une autre option consiste à créer un répertoire bin qui contient les fichiers .bat qui pointent vers les fichiers .exe appropriés.

EDIT 2: Le commentaire de Ben Voigt à une autre réponse mentionne que l'utilisation d'autres variables d'environnement, comme suggéré, pourrait ne pas réduire la longueur de %PATH% car elles seraient développées avant d'être stockées. Cela peut être vrai et je ne l'ai pas testé. Une autre option consiste à utiliser des formulaires 8dot3 pour les noms de répertoire plus longs, par exemple C:\Program Files est généralement équivalent à C:\PROGRA~1. Vous pouvez utiliser dir /x pour voir les noms plus courts.

EDIT 3: Ce test simple me porte à croire que Ben Voigt a raison.

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

À la fin de ceci, vous voyez la sortie hellohello plutôt que byehello.

EDIT 4: Si vous décidez d’utiliser des fichiers de commandes pour éliminer certains chemins de %PATH%, vous voudrez peut-être comment faire passer les arguments de votre fichier de commandes à votre exécutable, de sorte que le processus soit transparent ne remarque aucune différence entre l’appel du fichier de commandes et celui de l’exécutable). Je n'ai pas beaucoup d'expérience dans la rédaction de fichiers de commandes, mais cela semble bien fonctionner.

@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%

En règle générale, vous devez faire attention à l'exécution de fichiers de commandes à partir d'Internet, car vous pouvez faire toutes sortes de choses avec des fichiers de commandes, telles que le formatage de votre disque dur. Si vous ne faites pas confiance au code ci-dessus (que j'ai écrit), vous pouvez le tester en remplaçant la ligne

%actualdir%\%actualfile% %args%

avec

echo %actualdir%\%actualfile% %args%

Idéalement, vous devriez savoir exactement ce que chaque ligne fait avant de l'exécuter.

81
Mitch Schwartz

Ceci analysera votre variable d’environnement% PATH% et convertira chaque répertoire en son nom abrégé équivalent, puis rassemblera le tout:

@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!

Prenez la sortie et mettez à jour la variable PATH dans les variables d'environnement.

77
Todd Smith

si vous utilisez Windows Vista ou une version ultérieure, vous pouvez créer un lien symbolique vers le dossier. par exemple:

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

ferait un lien alors c:\pf serait votre dossier program files. J'ai rasé 300 caractères de mon chemin en utilisant cette astuce.

27
bmg002

Si quelqu'un est intéressé ...

Je constate que je n'ai jamais vraiment besoin de tous ces chemins en même temps, alors je crée un ensemble de fichiers de commandes "d'initialisation" qui les modifient en conséquence.

Par exemple, si je voulais faire du développement C++ dans Eclipse, je ferais:

> initmingw
> initeclipse
> Eclipse

C'est également pratique pour éviter les conflits entre les exécutables portant le même nom (tels que les compilateurs C++ et D, qui ont tous deux un make.exe).

Mes fichiers de commandes ressemblent généralement à ceci:

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

Je trouve cette approche relativement propre et je n’ai encore rencontré aucun problème.

10
YellPika

En général, je n'ai pas à m'inquiéter à ce sujet (je n'ai pas rencontré de limite de taille de chemin - je ne sais même pas ce que cela représente sur les systèmes Windows modernes), mais voici ce que je pourrais faire pour éviter de mettre le répertoire d'un programme dans le chemin:

  • la plupart des utilitaires de ligne de commande sont jetés dans un répertoire c:\util qui se trouve sur le chemin
  • sinon, je vais ajouter un simple fichier cmd/batch au répertoire c:\util qui ressemble à quelque chose comme:

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

ce qui crée essentiellement un alias pour la commande. Ce n'est pas nécessairement parfait. Certains programmes insistent vraiment pour être sur le chemin (ce qui est assez rare de nos jours), et d'autres programmes qui essaient de l'invoquer pourraient ne pas le trouver correctement. Mais pour la plupart des utilisations, cela fonctionne bien.

Mais généralement, je n'ai pas eu à craindre d'éviter d'ajouter des répertoires au chemin.

6
Michael Burr

Autre idée: utilisez DIR/X pour déterminer les noms abrégés générés pour les noms de fichiers non-8dot3. Ensuite, utilisez-les dans votre% PATH%.

Par exemple, "C:\Program Files" devient "C:\PROGRA ~ 1".

5
Android Eve

Utilisez la clé de registre App Path au lieu de la variable de chemin d'accès pour les chemins d'accès spécifiques à l'application:

http://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

5
Mad Hatter

J'ai écrit et utilise à chaque fois un flux standard (stdin/stderr/stdout) et un code de sortie programme PROXY (appelé dispatcher https://github.com/131/dispatcher )

Tous les programmes CLI que j'utilise (noeud, php, python, git, svn, rsync, plink ...) que j'utilise sont en fait le même fichier exe (environ 10 Ko, que je nomme différemment), que j'ai mis dans le même annuaire. Un fictif fichier texte statique fait le "nom de fichier proxy pour un mappage exe réel".

Dispatcher utilise l’API win32 de Process Management de bas niveau pour une transparence absolue.

En utilisant ce logiciel, j’ai UN SEUL répertoire supplémentaire dans mon PATH pour tous les programmes que je pourrais utiliser.

1
131

Créer un dossier c:\bin ajouter à votre chemin et créer un lien dur comme vous l’avez dit pourrait raccourcir la chaîne. Peut-être ajouter une variable pf aux vars système avec la valeur c:\Program Files puis remplacer c:\Program Files avec% pf% dans le chemin.

Modifier:

Créer un lecteur virtuel . Subst p: "c:\program files"

1
troynt

Les solutions ci-dessus ne fonctionnent que si vous pouvez réduire votre chemin. Dans mon cas, ce n'était pas vraiment une option, et il était fastidieux de devoir exécuter un script chaque fois que j'ouvrais une invite de commande. J'ai donc écrit un script simple qui s'exécute automatiquement lors de l'ouverture de la commande Invite et ajoute le contenu d'un fichier texte à votre chemin.

Il y a aussi des contextes où avoir ce script exécuté casse des choses (disons, dans un shell github ou cygwin), alors j'ai aussi ajouté un fichier qui contient une liste de chemins qui, si la commande Prompt est lancée dans eux, la variable de chemin isn ne change pas via le script de démarrage qui met normalement à jour le chemin.

@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

Et Path.txt ressemblera à quelque chose comme

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;

Alors que Dontsetup.txt ressemblera à quelque chose comme

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

Pour que cela fonctionne automatiquement au démarrage, ouvrez regedit, naviguez jusqu'à HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Command Processor, puis cliquez à droite sur la droite et appuyez sur new -> Multi-String Value. Nommez-le AutoRun. Définissez sa valeur sur 

C:\Users\Yams\setUpPath.bat

ou partout où vous avez stocké le fichier de commandes ci-dessus. 

0
Phylliida

Ne l’essayez pas, mais diviser PATH en plusieurs parties fonctionnera-t-il et les joindra-t-il dans un travail variable final?

Exemple initialement, disons que vous avez quelque chose comme

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

Au lieu de cela, vous créez:

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

Je suis ces étapes pour rendre les entrées gérables:

  1. Création d'utilisateurs différents pour différentes combinaisons d'utilisation de progiciels .. Exemple: (a) Création d'un site Web utilisateur pour la mise à disposition de tous les logiciels de développement Web; (b) Création d'une base de données d'utilisateurs pour mettre à disposition tous les progiciels de bases de données et d'entreposage de données. N'oubliez pas que certains logiciels peuvent créer plusieurs entrées. Ou parfois, je divise cela en utilisateurs spécifiques à Oracle, MSSQL et Oracle. Je mets MySQL/PostgreSQL, Tomcat, wamp, xamp all dans le compte utilisateur webr.

  2. Si possible, installez des packages communs tels que office, photoshop, .. en tant que système spécifique disponible pour tous les utilisateurs et des packages spéciaux en tant qu'utilisateur. Bien sûr, je devais me connecter à différents utilisateurs et les installer. Tous les logiciels ne peuvent pas fournir cette option. Si l'option "Installer uniquement pour cet utilisateur" n'est pas disponible, installez-la pour l'ensemble du système.

  3. J'évite d'installer des programmes dans le dossier Program File (x86) ou dans Program File. J'installe toujours dans le répertoire de base. Par exemple, MySQL 64 bits est placé dans "C:\mysql64" et MySQL 32 bits dans un dossier "C:\mysql". J'assume toujours l'ajout d'un suffixe 64 uniquement pour les logiciels 64 bits. Si aucun suffixe, alors c'est un 32 bits. Je suis la même chose pour Java et les autres. De cette façon, mon chemin sera plus court, sans compter "C:\Program File (x86)". Pour certains logiciels, il peut être nécessaire de modifier le fichier de configuration pour indiquer l'emplacement exact du fichier .exe. Seul le programme qui demande à être installé dans "C:\Program File (x86)" sera installé dans ce dossier. Je me souviens toujours de raccourcir les noms. J'évite les numéros de version comme Tomcat/release/version-2.5.0.3 tels détails. Si j'ai besoin de la version connue, je crée un fichier nom par version et le place dans le dossier Tomcat. En général, raccourcissez le lien autant que possible.

  4. Inclure tout lot pour remplacer le lien abrégé vers le chemin, si toutes les étapes ci-dessus ont dépassé la limite Windows.

Puis connectez-vous à un utilisateur spécifique (application mobile, base de données/entreposage de données ou développement Web .. ..) et effectuez les tâches appropriées.

Vous pouvez également créer des fenêtres virtuelles dans des fenêtres. Tant que vous possédez une copie du système d'exploitation sous licence, il est possible de créer plusieurs fenêtres virtuelles avec la même clé. Vous pouvez placer des packages spécifiques à une tâche particulière sur cette machine. Vous devez lancer séparément VM à chaque fois. Certains paquets gourmands en mémoire, tels que les réalisateurs de films d'animation 3D, doivent tous être placés dans la machine principale, et non dans VM, car VM n'aura qu'une partie de la RAM à sa disposition. Cependant, il est difficile de démarrer chaque VM.

0
Dr. A. Anukanth