Ajouter un répertoire et tous les sous-répertoires à la variable PATH avec une seule entrée

19

J'ai un répertoire dans mon dossier personnel dans lequel je place un logiciel en ligne de commande (CMD_Software). J'ai mis chaque logiciel dans son propre répertoire dans CMD_Software afin d'éviter l'encombrement.

Je voudrais faire une seule entrée dans ma variable PATH qui permettra d'accéder à CMD_Software et à tous les répertoires qu'il contient à partir de la ligne de commande.

J'ai essayé C:\Users\myuser\CMD_Software\*mais cela n'a rien fait. C'est le moment où j'ai manqué d'idées.

Veuillez noter que je n'essaie pas de définir un nouveau chemin d'accès dans le terminal, j'essaie de définir un nouveau chemin d'accès dans les "Variables d'environnement" disponibles sur l'onglet "Avancé" des Propriétés système.

Landon Brainard
la source
Avez-vous essayé quelque chose comme «C: \ Users \ myuser \ CMD_Software *»?
terdon
4
Je ne pense pas que ce soit possible.
Harry Johnston

Réponses:

16

La variable PATH ne prend pas en charge les caractères génériques ni la récursivité. C'est par conception.

Il existe deux solutions possibles que j'ai utilisées à l'occasion:

  • Créez un répertoire avec des fichiers batch simples et ajoutez ce répertoire au PATH. Chaque fichier batch peut lancer le programme que vous souhaitez, par exemple:

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

    La première ligne est un commentaire, la seconde commence par @pour éviter d'afficher la commande en cours d'exécution et %*est utilisée pour transmettre tous les arguments de ligne de commande à l'EXE.

  • Ajoutez des alias à CMD.EXE:

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

    Cela se traduit essentiellement CMD_Softwaredans l'invite de commandes par tout ce qui se trouve après le signe égal. Le $*est remplacé par les arguments fournis.

Je préfère la deuxième approche, car vous pouvez regrouper tous les alias dans un seul fichier (voir le commutateur "/ MACROFILE" dans DOSKEY /?) Et le faire exécuter automatiquement chaque fois que l'interpréteur de commandes commence à utiliser un paramètre de registre (voir la clé "AutoRun" dans CMD /?).

Un inconvénient de la deuxième méthode est que les alias ne fonctionnent qu'au début d'une ligne de commande. Cela peut être un problème si vous souhaitez chaîner des commandes. Par exemple, CLS & CMD_Softwarene fonctionnera que si vous placez l'alias sur une ligne distincte à l'aide de parenthèses:

CLS & (
CMD_Software
)

Chaque fois que cela devient un problème, je reviens simplement à l'approche du fichier batch.

efotinis
la source
Merci! La première méthode fonctionne très bien pour moi, principalement parce que je n'ai pas à jouer avec le registre lorsque je transfère mes données entre ordinateurs. C'est également assez bien rangé et pratique car vous n'avez passé qu'un tout petit peu plus de temps à créer un fichier bat lorsque vous obtenez ledit utilitaire.
cyqsimon
Malheureusement, je dois expurger ma déclaration précédente aussi rapidement. J'ai rencontré d'étranges problèmes avec des scripts se terminant de manière aléatoire à mi-chemin de l'exécution après avoir adopté la première méthode. En particulier, wget pour Windows semble apprécier de tuer mon script une fois le téléchargement terminé. J'ai perdu les deux dernières heures à dépanner péniblement mon script, mais j'ai finalement essayé de jeter tous les exes dans un seul répertoire racine, et les problèmes ont tous disparu. Par conséquent, je conseillerais fortement la prudence avant que quiconque ne mette tout en œuvre avec cette méthode.
cyqsimon
4

C'est ce que j'utilise pour résoudre le problème. Copiez ce script ci-dessous et enregistrez-le FIXPATH.BATdans le dossier que vous avez ajouté à la PATHvariable d'environnement. Par exemple:

C: \ Users \ myuser \ CMD_Software \

Maintenant, chaque fois que vous devez exécuter un programme qui se trouve dans un sous-dossier, dites ...

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

Exécutez d' fixpathabord puis entrez la commande (par exemple grepou exiftool) comme ceci:

Microsoft Windows [version 6.3.9600]
(c) 2013 Microsoft Corporation. Tous les droits sont réservés.

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


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

pour / R %% d dans (.) faire (
    définir "dirs =! dirs!; %% d"
)

chemin =% chemin%! dirs!
(endlocal
    définir "ret =% PATH%"
)
cmd / K "title [#] Path Fixed [#] && path% ret%"
sortie / B

Merci à la réponse de @ VonC

Vinayak
la source
1

Placez un sous-répertoire "programlinks \" sous ... \ CMD_Software (ou n'importe où, en fait) et remplissez-le de liens symboliques ou de liens physiques vers chaque exécutable auquel vous souhaitez accéder. Une seule entrée dans le CHEMIN pour ... \ programlinks suffira.

kreemoweet
la source
1
Le principal problème avec cela est que s'il existe des bibliothèques dont l'exécutable dépend, situées potentiellement dans le même répertoire que l'exe, elles ne seront pas utilisées. Ou du moins c'est ce qui se passe avec ma tentative avec ça.
zero298
Grande remarque, @ zero298. Bien que j'aimerais, si quelqu'un est sûr à 100% et peut confirmer que c'est en fait vrai, veuillez faire sonner. (Parce que cette méthode est sinon la plus propre de toutes.)
Henrik
-1

Si l'idée ne vous dérange pas trop, vous pouvez copier vos outils de ligne de commande dans le répertoire Windows \ System32. Ensuite, vous pouvez les exécuter à partir de n'importe quel répertoire, tout comme ping ou ipconfig.

modifier
Après un peu de bricolage, c'est possible. Il vous suffit d'utiliser des points-virgules pour délimiter vos répertoires. Supposons que vous ayez un programme dans "dossier1" et "dossier2". Vous écririez votre chemin comme ceci:

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

Ensuite, vous pouvez appeler un programme dans l'un ou l'autre répertoire directement à partir de la ligne de commande. AFAIK, il n'y a pas d'autre moyen de le faire avec une seule ligne.

Informations de support: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
la source
1
Cela n'a pas beaucoup de sens. 1. Cela effacerait tout contenu précédent de la variable PATH . 2. La variable PATH ne contiendrait que le dossier, pas ses sous-répertoires (résultat souhaité). 3. Invoquer program.batas %PATH%\program.batest plus ou moins l'opposé de ce pour quoi PATH est conçu.
Dennis