CMD: ajouter au chemin sans le dupliquer?

12

Pour une CMDsession, je peux facilement définir un nouveau chemin:SET PATH=%PATH%;"insert custom path here"

Cela dans un fichier de commandes ne prend pas en compte si le chemin d'accès personnalisé est déjà inclus. Comment éviter de le dupliquer (c'est-à-dire vérifier s'il est déjà contenu dans la "chaîne" PATH).

Remarques:

  1. Connexes: Comment ajouter des variables d'environnement définies par l'utilisateur à la variable système PATH dans Windows 7?
  2. Connexe: Comment puis-je ajouter définitivement une entrée dans la variable PATH du système, via la ligne de commande?
  3. Même question pour UNIX: Ajouter un répertoire à $ PATH s'il n'est pas déjà là
  4. Quelques opérations de chaîne "CMD" expliquées: http://ss64.com/nt/syntax-replace.html
Horst Walter
la source
Il convient de souligner que dans ce contexte, la duplication est inoffensive. Il serait probablement plus judicieux de permettre la duplication que d'essayer de l'éviter et d'introduire le risque d'un faux positif.
Harry Johnston

Réponses:

14

Semblable à la réponse de MaddHackers, juste plus compact.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%est votre nouveau chemin, vous pouvez bien sûr utiliser des littéraux à la place. Ce qu'il fait: echo %path%|find /i "%np%">nulrecherche une chaîne dans le chemin existant, en supprimant la sortie. ||signifie exécuter en cas d'échec, donc cela signifie: chemin de recherche de la chaîne à ajouter, et s'il n'est pas trouvé, ajoutez-le.

Edit: Généralement, il n'est pas nécessaire de citer des chemins, même ceux contenant des espaces, mais si vous voulez les citer , cette version fonctionnera avec des chemins entre guillemets doubles:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Edit: changé findstr /i /c:en find /icar findstrpeut mal interpréter certaines séquences comme l'a noté KubaOber dans les commentaires

wmz
la source
Bien, je savais qu'il y avait une façon plus propre de faire ça ... préfère toujours bash, mais c'est juste moi: D Merci pour l'aide!
MaddHacker
Bien, mais ça marche avec des espaces sur le chemin? Je l'ai testé avec mes chemins particuliers, celui "cité et avec des espaces" est rajouté. L'un vient d'être cité mais aucun espace ne semble fonctionner.
Horst Walter
1
@HorstWalter Oui, cela devrait fonctionner avec n'importe quel chemin (je viens de vérifier avec certains espaces, y compris). Qu'entendez-vous par «cité»? Vous n'avez pas besoin d'utiliser des guillemets dans les chemins, même ceux contenant des espaces. Si votre %np%contient des guillemets - oui, cela entraînera un mauvais comportement.
wmz
2
@HorstWalter Voir ma modification. Ce n'est un problème que si vous utilisez une variable, l'utilisation de littéraux (comme dans echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") devrait fonctionner correctement.
wmz
1
@wmz echo d\. | findstr /c:"d\."échoue, mais echo d\. | find "d\."réussit
Réinstallez Monica le
4

Je sais que c'est sale, mais cela devrait fonctionner:

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

%checkstr%est la chaîne à vérifier dans le CHEMIN et %newpath%est le nouveau CHEMIN à ajouter au CHEMIN actuel

J'espère que cela aide, et je suis sûr qu'il existe un moyen plus simple, mais cela devrait faire l'affaire pour l'instant.

ÉDITER

Donc, si vous ne voulez pas ajouter les outils UNIX à Windows, vous pouvez essayer cette syntaxe par lots:

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, pas plus joli, et peut être fait en une seule ligne si vous pouvez faire fonctionner la commande find de pipe comme une sous-commande dans l'instruction if ...

MaddHacker
la source
2

Script basé sur la réponse 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
djangofan
la source