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?

0voto

Riccardo La Marca Points 209

Ce vbscript/batch hybride "append_sys_path.vbs" n'est pas intuitif mais fonctionne parfaitement :

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

Avantages de cette approche :

1) Cela ne tronque pas l'environnement du chemin du système à 1024 caractères.
2) Cela ne concatène pas l'environnement du chemin du système et de l'utilisateur.
3) Cela s'exécute automatiquement en tant qu'administrateur.
4) Préserve les pourcentages dans l'environnement du chemin du système.
5) Prend en charge les espaces, les parenthèses et les caractères spéciaux.
6) Fonctionne sur Windows 7 et versions ultérieures.

0voto

enrique Points 136

Alternativement, si vous souhaitez définir le chemin du système, voici une solution basée sur la réponse de JonathanDavidArndt.

@echo off
setlocal
chcp 65001 >nul
call :addToSystemPath C:\Program Files\Git\cmd
exit /b

:addToSystemPath
set ADDED_FOLDER=%*
REM -- Excellent exemple du lanceur de Shell portable de Strawberry Perl :
if #%ADDED_FOLDER:~-1%# == #\# set ADDED_FOLDER=%ADDED_FOLDER:~0,-1%

REM -- Charger le CHEMIN DU SYSTÈME à partir du registre, en veillant à ce qu'il ne soit pas vide
SET PATH_ENV_HIVE=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
reg query "%PATH_ENV_HIVE%" /v PATH 1>nul 2>&1
if ERRORLEVEL 1 goto skipLoadPath
for /f "usebackq tokens=2,*" %%A in (`reg query "%PATH_ENV_HIVE%" /v PATH`) do set SYSTEM_PATH=%%B
REM -- Facultativement, vérifie si ce répertoire fait déjà partie du CHEMIN DU SYSTÈME
REM -- Cela évitera la duplication et permettra d'exécuter cela plusieurs fois,
REM -- mais si un sous-répertoire de l'actuel fait déjà partie du CHEMIN DU SYSTÈME,
REM -- ce script ne fera simplement rien
echo %SYSTEM_PATH%|find "%ADDED_FOLDER%" >nul
if errorlevel 1 goto skipLoadPath
:skipSetXPath
echo Dossier "%ADDED_FOLDER%" déjà dans le chemin
exit /b

:skipLoadPath
REM -- Éviter d'ajouter un point-virgule inutile au précédent CHEMIN DU SYSTÈME
if not "" == "%SYSTEM_PATH%" set "SYSTEM_PATH=%SYSTEM_PATH%;"
REM -- Définir de manière permanente l'emplacement suivant comme faisant partie du chemin du système
setx /M PATH "%SYSTEM_PATH%%ADDED_FOLDER%"
rem >nul 2>&1
rem "Sur un système local, les variables créées ou modifiées par cet outil seront disponibles dans les futures fenêtres de commande mais pas dans la fenêtre de commande CMD.exe actuelle."
REM -- Cela mettra à jour l'environnement actuel, car SETX met à jour uniquement le registre
set "PATH=%PATH%;%ADDED_FOLDER%"
exit /b

0voto

user15566053 Points 61

Je pense que la plupart des solutions mentionnées ici sont mauvaises, car elles corrompront la valeur du chemin dans le registre en convertissant son type de REG_EXPAND_SZ en REG_SZ, ou remplaceront au moins toutes les variables "modèles" à l'intérieur de la valeur du chemin par leurs valeurs actuelles, de sorte que l'utilisateur perdrait la fonctionnalité de modèle prévue (Exemple: Chemin=%PYTHONHOME%\bin;%PERLHOME%\bin;... serait converti en un Chemin statique=D:\dev\python\v3.12.2\bin;C.\perl\bin;...

Voici une solution simple qui conserve le type REG_EXPAND_SZ et de telles variables modèles:

@echo off

:: obtenir la variable Path actuelle du registre (utilisateur)
for /F "usebackq tokens=1,2,*" %%a in (`reg query HKCU\Environment /v Path`) do (
    set "current=%%c"
)

:: préfixer des éléments, dans ce cas "F:\bin;"
set prepend=F:\bin;
set "current=%prepend%%current%"

:: créer une sauvegarde, au cas où
reg export HKCU\Environment %TMP%\~env_backup.reg /y

:: écraser le chemin actuel dans le registre (utilisateur) avec la version étendue
reg add HKCU\Environment /v Path /t REG_EXPAND_SZ /d "%current%" /f >nul

:: préfixer les mêmes éléments également pour la session CMD actuelle
set "Path=%prepend%%Path%"

-1voto

Raj Tukadiya Points 61

Étapes : 1. Ouvrez une fenêtre d'invite de commandes avec les droits d'administrateur.

Étapes : 2. Exécutez la commande : setx /M PATH "chemin\vers\;%PATH%"

[Remarque : Assurez-vous de modifier la commande pour que le chemin\vers reflète le chemin du dossier à partir de votre racine.]

Exemple : setx /M PATH "C:\Program Files;%PATH%"

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