SETX n’ajoute pas le chemin d’access à la variable de chemin système

J’ai essayé ci-dessous la commande pour append un chemin d’access à la variable du chemin système par fichier de commandes:

setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin" 

J’ai vérifié le chemin de la variable système après avoir exécuté au-dessus du fichier de commandes, le chemin ci-dessus n’est pas là.

entrer la description de l'image ici

Vous pouvez voir toutes les fenêtres Contenu de la Variable value ci-dessous:

 C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMDAPP\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles (x86)\ATI Technologies\ATI.ACE\Core-Static; 

Qu’est-ce que je fais mal?

Pour revenir sur la réponse de @ Endoro (il me manque le commentateur):

Si vous voulez changer les variables d’environnement à l’échelle du système, vous devez utiliser / M , a la:

 setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin" /M 

setx.exe est difficile sur l’emplacement du / M, BTW. Il doit être à la fin.

vous ne devez pas regarder les variables d’environnement du système mais les variables de votre environnement utilisateur:

entrer la description de l'image ici

 SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\ 

Il appenda votre chemin à la variable système

ATTENTION!

setx va tronquer la valeur à 1024 caractères.

Si vous l’utilisez pour modifier PATH, vous pourriez endommager votre système.

Vous pouvez utiliser cet extrait de code PowerShell pour append quelque chose à votre chemin:

 $new_entry = 'c:\blah' $old_path = [Environment]::GetEnvironmentVariable('path', 'machine'); $new_path = $old_path + ';' + $new_entry [Environment]::SetEnvironmentVariable('path', $new_path,'Machine'); 

Dans le cas où vous ne souhaitez pas rappend une entrée déjà existante, faites comme cela (voir pour une version plus détaillée plus bas):

 $new_entry = 'c:\blah' $search_pattern = ';' + $new_entry.Replace("\","\\") $old_path = [Environment]::GetEnvironmentVariable('path', 'machine'); $replace_ssortingng = '' $without_entry_path = $old_path -replace $search_pattern, $replace_ssortingng $new_path = $without_entry_path + ';' + $new_entry [Environment]::SetEnvironmentVariable('path', $new_path,'Machine'); 

Voici une version plus récente que j’utilise maintenant (2017-10-23). Cette version gère correctement les chemins nesteds. Par exemple, il gère le cas de PATH contenant “c: \ tool \ foo” et vous voulez append “c: \ tool”.

 $desired_entry = 'C:\test' $old_path = [Environment]::GetEnvironmentVariable('path', 'machine'); $old_path_entry_list = ($old_path).split(";") $new_path_entry_list = new-object system.collections.arraylist foreach($old_path_entry in $old_path_entry_list) { if($old_path_entry -eq $desired_entry){ # ignore old entry }else{ [void]$new_path_entry_list.Add($old_path_entry) } } [void]$new_path_entry_list.Add($desired_entry) $new_path = $new_path_entry_list -Join ";" [Environment]::SetEnvironmentVariable('path', $new_path,'Machine'); 

Ne doit jamais utiliser setx pour un chemin car il est limité à 1024 caractères, comme mentionné.

Pourrait utiliser reg add:

 set pathkey="HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment" for /F "usebackq skip=2 tokens=2*" %%A IN (`reg query %pathkey% /v Path`) do (reg add %pathkey% /f /v Path /t REG_SZ /d "%%B;C:\Program Files\MySQL\MySQL Server 5.5\bin") 

ou définissez pathkey = “HKEY_CURRENT_USER \ Environment” pour le chemin d’access de l’utilisateur.

Ensuite, pour diffuser le changement:

 powershell -command "& {$md=\"[DllImport(`\"user32.dll\"\",SetLastError=true,CharSet=CharSet.Auto)]public static extern IntPtr SendMessageTimeout(IntPtr hWnd,uint Msg,UIntPtr wParam,ssortingng lParam,uint fuFlags,uint uTimeout,out UIntPtr lpdwResult);\"; $sm=Add-Type -MemberDefinition $md -Name NativeMethods -Namespace Win32 -PassThru;$result=[uintptr]::zero;$sm::SendMessageTimeout(0xffff,0x001A,[uintptr]::Zero,\"Environment\",2,5000,[ref]$result)}"