113 votes

Comment ajouter une variable à la variable PATH de Windows en utilisant setx? Avoir des problèmes étranges

Je veux modifier la variable PATH de Windows en utilisant setx. Le suivant fonctionne au moins 50% du temps sur Windows 8:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

Si cela donne l'erreur "l'argument par défaut ne peut être utilisé que 2 fois", alors le suivant fonctionne parfois:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

La différence est que nous avons enveloppé le second argument entre guillemets. Je crois que les guillemets sont nécessaires lorsque %PATH% se développe pour inclure des espaces.

Cependant, j'ai rencontré quelques problèmes étranges sur Windows 7. Sur une machine Windows 7 particulière, j'ai eu ce problème:

echo %PATH%

Ça affiche:

C:\Foo\;C:\Bar\;[...beaucoup de chose...]C:\Baz\

Ensuite je fais ça:

setx PATH "%PATH%;C:\Quux\"

Ensuite il dit "Erreur: Tronqué à 1,024 caractères." Maintenant vérifions ce que contient PATH:

echo %PATH%

Ça affiche:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...beaucoup de choses, maintenant dupliquées...]C:\B

...et c'est coupé à 1,024 caractères. Il est dépassé à cause des duplications. Aussi intéressant: La valeur de PATH change malgré le fait que setx ait levé une erreur et n'a pas dit "Succès".

J'ai pu reproduire ce comportement étrange plusieurs fois (heureusement j'avais sauvegardé le contenu original de PATH).

À ce moment, la seule méthode sûre que je connais pour ajouter à PATH est la suivante:

  1. echo le PATH.

  2. Copier le contenu de PATH dans un fichier texte et ajouter manuellement ;C:\Python27\;C:\Python27\Scripts\ à la fin du PATH.

  3. Copier le tout hors du fichier texte.

  4. setx PATH ""

Ce processus fonctionne à chaque fois sur Windows 7 et Windows 8.

Je devrais vraiment être capable de faire cela en une seule commande. Qu'est-ce que je fais de travers?

3voto

Inetquestion Points 150

Malheureusement, avec les outils OOTB, vous ne pouvez pas ajouter directement/facilement le chemin système ou le chemin utilisateur. Si vous voulez rester avec les outils OOTB, vous devez interroger soit le chemin SYSTEME soit le chemin UTILISATEUR, enregistrer cette valeur comme une variable, puis ajouter vos ajouts et l'enregistrer en utilisant setx. Les deux exemples ci-dessous montrent comment les récupérer, les enregistrer et ajouter vos ajouts. Ne vous embrouillez pas avec %PATH%, c'est une concaténation de l'utilisateur+SYSTEME et causera beaucoup de duplications dans le résultat. Vous devez les diviser comme indiqué ci-dessous...

Ajouter au chemin système

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\chemin1;C:\chemin2" /M

Ajouter au chemin utilisateur

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B

setx PATH "%userPATH%;C:\chemin3;C:\chemin4"

3voto

JonathanDavidArndt Points 1563

Je voulais juste réitérer : la réponse précédente de Manohar Reddy Poreddy est la bonne.

Il y a plusieurs améliorations qui peuvent être apportées, que j'ai pensé utile de partager :

@echo off

REM -- Utilisez le répertoire où se trouve le script. Pour le répertoire de travail actuel, utilisez %CD%
set CURRENT_DIR=%~dp0
REM -- Excellent exemple du lanceur de shell portable de Strawberry Perl :
if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1%

REM -- Chargez le PATH utilisateur depuis le registre, en vous assurant qu'il n'est pas vide
reg query HKCU\Environment /v PATH 1>nul 2>&1
if ERRORLEVEL 1 goto skipLoadPath
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set MY_USER_PATH=%%B

REM -- Facultativement, vérifie si ce répertoire fait déjà partie du PATH utilisateur
REM -- Cela évitera la duplication et permettra l'exécution multiple,
REM -- mais si un sous-répertoire du répertoire actuel fait déjà partie du PATH utilisateur,
REM -- ce script ne fera tout simplement rien
echo %MY_USER_PATH%|find "%CURRENT_DIR%" >nul
if errorlevel 1 (goto skipLoadPath) else (goto skipSetXPath)
:skipLoadPath

REM -- Éviter d'ajouter un point-virgule inutile au PATH utilisateur précédent
if not "" == "%MY_USER_PATH%" set "MY_USER_PATH=%MY_USER_PATH%;"
REM -- Définir de manière permanente l'emplacement suivant comme partie du chemin système
setx PATH "%MY_USER_PATH%%CURRENT_DIR%" >nul 2>&1
REM -- Cela mettra à jour l'environnement actuel, puisque SETX ne met à jour que le registre
set "PATH=%PATH%;%MY_USER_PATH%%CURRENT_DIR%"
:skipSetXPath

2voto

Shivan Points 517

J'ai été confronté aux mêmes problèmes et trouvé une solution facile maintenant.

Utilisation de pathman.

pathman /as %M2%

Ajoute par exemple %M2% au chemin du système. Rien de plus et rien de moins. Plus de problèmes à obtenir un mélange du chemin de l'utilisateur et du chemin du système. Plus besoin de chercher désespérément les bonnes valeurs dans le registre...

Essayé sous Windows 10

1voto

Drunk_Kremlin Points 21
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

Cela devrait ajouter à la variable d'environnement système Path sans ajouter d'extra, et en conservant l'original intact sans perte de données. J'ai utilisé cette commande pour corriger le problème que le contrôle Web de McAfee pose au client de messagerie Outlook de Microsoft.

Les guillemets sont utilisés dans la valeur du chemin car la ligne de commande voit les espaces comme un délimiteur et tentera d'exécuter la valeur suivante dans la ligne de commande. Les guillemets remplacent ce comportement et gèrent tout ce qui se trouve à l'intérieur des guillemets comme une chaîne.

0voto

Carl Bennett Points 11

J'avais tellement de mal à gérer mes laboratoires informatiques lorsque la variable d'environnement %PATH% approchait les 1024 caractères que j'ai écrit un script Powershell pour le corriger.

Vous pouvez télécharger le code ici : https://gallery.technet.microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

Vous pouvez également l'utiliser comme un moyen simple d'ajouter, supprimer et analyser en toute sécurité des entrées PATH. Profitez-en.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X