J'essaie de définir des variables d'environnement à l'aide de la commande setx
, comme suit
setx PATH "f:\outils communs\git\bin; f:\outils communs\python\app; f:\outils communs\python\app\scripts; f:\outils communs\Ruby\bin; f:\masm32\bin; F:\Borland\BCC55\Bin;% PATH% "
Cependant, j'obtiens l'erreur suivante si la valeur est supérieure à 1024 caractères:
AVERTISSEMENT: les données en cours d'enregistrement sont tronquées à 1024 caractères.
SUCCESS: La valeur spécifiée a été enregistrée.
Mais certains des chemins à la fin ne sont pas enregistrés dans la variable, je suppose en raison de la limite de caractères comme le suggère l'erreur.
Votre meilleur pari est d’éditer directement le registre.
Accédez à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
et modifiez la valeur Path
(puis redémarrez pour activer la nouvelle valeur).
Notez cependant que, même si vous pouvez entrer un très long chemin (jusqu’à la longueur maximale de la variable d’environnement; 2 048 ou 32 768 octets selon la source), tous les logiciels ne pourront pas le lire et le gérer. correctement si c'est trop long.
si vous utilisez Windows Vista ou une version ultérieure, vous pouvez créer un symbolic link
dans le dossier. par exemple:
mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"
ferait un lien alors c:\pf
serait votre dossier de fichiers de programme. J'ai rasé 300 caractères de mon chemin en utilisant cette astuce.
(Je sais que ce n'est pas lié à setx mais c'est utile pour les personnes qui cherchent trop avec une limite de 1024 caractères)
Vous pouvez utiliser un script PowerShell similaire à celui-ci:
$newPath = 'f:\common tools\git\bin;f:\common tools\python\app;f:\common tools\python\app\scripts;f:\common tools\Ruby\bin;f:\masm32\bin;F:\Borland\BCC55\Bin'
$oldPath = [Environment]::GetEnvironmentVariable('path', 'machine');
[Environment]::SetEnvironmentVariable('path2', "$($newPath);$($oldPath)",'Machine');
L'appel Environment.SetEnvironmentVariable () API diffusera WM_SETTINGCHANGE
de sorte que vous n'avez pas besoin de redémarrer.
Cet outil de ligne de commande open-source SetEnv permet de modifier le PATH et les autres variables d'environnement sans limitation. Il utilise un tampon dynamique, donc pas de limitations statiques comme 1024.
http://www.codeproject.com/Articles/12153/SetEnv
Le choix d'un% en tant que préfixe à ajouter à une variable aurait pu être meilleur, car il rend parfois la syntaxe difficile s'il est utilisé avec d'autres variables locales par lots ...
Un outil bien supérieur à setx pour la manipulation du chemin est pathed.exe . Malheureusement, cela se limite à l'édition du chemin.
Outre une expérience utilisateur supérieure à celle de setx, vous n'avez pas de limite de 1024 caractères. Contrairement à la manipulation directe du registre, cette application utilise l'appel Environment.SetEnvironmentVariable () API qui diffusera WM_SETTINGCHANGE
.
Ma méthode préférée consiste à modifier les noms de dossier dans les variables PATH pour utiliser les noms 8.3. Cette réponse StackOverflow a un script génial (exécuté à partir d'un fichier .bat) qui générera la version "réduite" de la variable PATH entière, que vous pourrez ensuite coller dans la ou les boîtes de dialogue Editer la variable. Le seul inconvénient est que vous devrez séparer les parties SYSTEM et USER. Au fur et à mesure que le script parcourt la version détaillée de chaque dossier, il le supprime et vous avertit des chemins non valides/non existants. Bon petit bonus de nettoyage.
Vous pouvez mettre cette ligne dans votre BAT:
setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"
Voir le double %%
.
(Référence: https://support.Microsoft.com/en-us/kb/75634 )
Je pense que le meilleur moyen est le suivant (avec powershell). De cette manière, vous évitez également le caractère unique de 1024 caractères.
Vous pouvez voir le code sur: https://Gist.github.com/drazul/b92f780689bd89a0d2a7
#------------ Add path to system variable -------------------------------------
$path2add = ';C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');
If (!$systemPath.contains($path2add)) {
$systemPath += $path2add
$systemPath = $systemPath -join ';'
[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
write-Host "Added to path!"
write-Host $systemPath
}
#------------ Delete path from system variable --------------------------------
$path2delete = 'C:\path;'
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');
$systemPath = $systemPath.replace($path2delete, '')
$systemPath = $systemPath -join ';'
[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
write-Host "Deleted from path!"
write-Host $systemPath
#------------ Clean system variable -------------------------------------------
$systemPath = [Environment]::GetEnvironmentVariable('Path', 'machine');
while ($systemPath.contains(';;')) {
$systemPath = $systemPath.replace(';;', ';')
}
[Environment]::SetEnvironmentVariable('Path', $systemPath, 'Machine');
write-Host "Cleaned path!"
write-Host $systemPath
s'il n'est pas nécessaire de garder le système PATH et l'utilisateur PATH séparés:
::setx /m truncate variable length to 1024 REG ADD
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_SZ /f /d "%PATH%"
::empty local path, use system wide only, else it will enlarge with every setx /m
setx PATH ""
::setx is dummy but propagate system wide variables with it
setx /m A A