web-dev-qa-db-fra.com

SETX n'ajoute pas de chemin à la variable de chemin d'accès système

J'ai essayé la commande ci-dessous pour ajouter un chemin à une variable de chemin d'accès système par fichier batch:

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

J'ai vérifié le chemin des variables système après avoir exécuté le fichier de commandes ci-dessus, le chemin ci-dessus n'est pas là.

enter image description here

Vous pouvez voir toutes les fenêtres Variable value contenu 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?

21
Hamed Kamrava

Pour se greffer sur la réponse de @ Endoro (il me manque le représentant pour commenter):

Si vous souhaitez modifier 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 pointilleux sur le placement du/M, BTW. Il faut que ce soit à la fin.

29
mojo

AVERTISSEMENT!

setx tronquera la valeur à 1024 caractères.

Si vous l'utilisez pour modifier PATH, vous risquez de gâcher votre système.

Vous pouvez utiliser cet extrait PowerShell pour ajouter 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 rajouter une entrée déjà existante, quelque chose comme ça fera l'affaire (voir pour une meilleure version plus bas):

$new_entry = 'c:\blah'
$search_pattern = ';' + $new_entry.Replace("\","\\")

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');
$replace_string = ''
$without_entry_path = $old_path -replace $search_pattern, $replace_string
$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 imbriqués. Par exemple. il gère le cas de PATH contenant "c:\tool\foo" et vous voulez ajouter "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');
9
Robert Fey

vous ne devriez pas regarder les variables d'environnement système mais vos variables d'environnement utilisateur:

enter image description here

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

Il ajoutera votre chemin vers la variable système

5
chiragchavda.ks

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

Pourrait utiliser reg ajouter:

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 utilisateur.

Puis 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,string 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)}"
3
colin lamarre

J'ai rencontré le même problème lorsque j'ai essayé d'ajouter des variables de chemin d'accès liées à fortran (Eclipse pour c/c ++/fortran)

J'ai essayé SETX/M Path "% PATH%; C:\Users\mahidhai\cygwin64\bin" dans la commande Invite en tant qu'administrateur. J'ai reçu un avertissement disant que les données étaient tronquées à 1024 caractères et stockées.

SOLUTION: Accédez directement au fichier de registre. Exécuter-> regedit Naviguer vers l'environnement

(Chemin complet: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)

Cliquez sur le registre de chemin et ajoutez directement la variable de chemin. Ou supprimez toutes les variables de chemin répétées.

Maintenant, ouvrez l'invite de commande, puis exécutez la même commande setx/M path "% path%"

La variable de chemin peut être liée à C ou C++ ou fortran

Pas de soucis lors de la modification du fichier de registre, il sera enregistré de façon permanente, n'ayez pas peur car les variables d'environnement sont dans le gestionnaire de session.

0
V SAI MAHIDHAR