Surmonter la limite de 1024 caractères avec setx

74

J'essaie de définir des variables d'environnement à l'aide de la setxcommande, 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.

Madhur Ahuja
la source
Il existe une liste de moyens alternatifs pour modifier le %PATH%
fichier
1
Consultez Rapid Environment Editor, qui vous permet d’éditer graphiquement toutes les variables d’environnement (vous pouvez également enregistrer une sauvegarde).
ja72
3
Est-ce que quelqu'un d'autre s'inquiète de ce succès prétendant alors qu'il ne fait clairement pas ce qui était demandé? N’est-il pas inquiétant que cela n’échoue pas en laissant le chemin exactement comme il était?
Chad Schouggins
Est-ce que cela reste tronqué sur Windows 10?
cowlinator
1
Oui, c'est le cas sous Windows 10
Ivan

Réponses:

48

Votre meilleur pari est d’éditer directement le registre.

Accédez à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentla Pathvaleur et modifiez-la (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, en fonction de la source), tous les logiciels ne pourront pas le lire et le manipuler correctement s’il est trop long.

Synetech
la source
1
Le redémarrage est-il vraiment nécessaire ici? Comment setx le fait-il? Setx ne nécessite pas de redémarrage.
Madhur Ahuja
11
Oui, un redémarrage est requis. setxédite le registre comme je l'ai indiqué, puis diffuse un WM_SETTINGCHANGEmessage. Cela indique à toutes les fenêtres de niveau supérieur qu'un paramètre système a été modifié (dans ce cas, une variable d'environnement). Sans cela, Explorer et les programmes avec lesquels vous avez ouvert ne seront pas informés de la modification. Vous pouvez diffuser le message vous-même manuellement (j'ai écrit un programme dans ce but, et un fichier de commandes à remplacer SETXqui crée une édition du registre suivie de la diffusion), mais, tout comme setxla boîte de dialogue Envvar des propriétés système, elle a des effets secondaires qui rendre le redémarrage préférable.
Synetech
2
Oh et éditer une env.var. pose effectivement des problèmes si vous ne redémarrez pas, car toutes les variables d’environnement contenant d’autres variables ne seront plus développées. Par exemple, je viens de le diffuser et maintenant ceci est mon chemin et je reçois une erreur parce que le chemin est maintenant "cassé" / vide. Aucun des vars ne se développera correctement jusqu'à ce que je redémarre. Malheureusement, c'est «normal». :-|
Synetech
3
J'ai trouvé un petit script PowerShell qui diffusera le message WM_SETTINGCHCH.
Justin Dearing
10
Vous pouvez utiliser la méthode de registre ci-dessus via la commande REG add, puis utiliser SETX pour définir une autre variable sur elle-même (par exemple: SETX / M USERNAME% USERNAME%). Cela entraînera la définition du message WM_SETTINGCHANGE et vous donnera la possibilité de définir le chemin à partir d'un fichier de commandes.
Art
30

Si vous utilisez Windows Vista ou supérieur, vous pouvez créer un symbolic linkdans le dossier. par exemple:

mklink /d C:\pf "C:\Program Files"
mklink /d C:\pf86 "C:\Program Files (x86)"

ferait un lien ainsi c:\pfserait 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)

Reza
la source
18

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 de l'API Environment.SetEnvironmentVariable () sera diffusé WM_SETTINGCHANGEafin que vous n'ayez pas besoin de redémarrer.

Justin Dearing
la source
N'avez-vous pas également besoin de la ligne suivante: [Environment] :: SetEnvironmentVariable ('path', "$ newPath", "Machine");
Fedor Steeman
1
En 3ème ligne, je ne suis pas sûr de l’avantage des signes d’argent et des parenthèses supplémentaires. Ne pourriez-vous pas simplement dire [Environment]::SetEnvironmentVariable('path', "$newPath;$oldPath",'Machine')?
twasbrillig
1
@twasbrillig Je suis juste prudent lorsque j'inclus une variable dans une chaîne. dans ce cas, ce n'est pas nécessaire.
Justin Dearing
3
Vous pouvez appeler cela à partir d'une invite de commande de l'administrateur:@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::SetEnvironmentVariable('path',\"C:\Program Files (x86)\GNU\GnuPG;$([Environment]::GetEnvironmentVariable('path','Machine'))\",'Machine');"
Mark C
7

Cet outil de ligne de commande open-source SetEnv permet de modifier le chemin 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 ...

Kharlos Dominguez
la source
> L’outil SetEnv permet de modifier le PATH et d’autres variables d’environnement sans limitation . En effet. En fait, j'avais personnellement travaillé avec Darka sur cette page pour améliorer encore SetEnv afin qu'il puisse pleinement prendre en charge le développement / les sous-variables (la section Expansion de variable dynamique), ce qui aide réellement à réduire la longueur du chemin brut.
Synetech
4

Un outil bien supérieur que setx pour la manipulation de 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 de l' API Environment.SetEnvironmentVariable () qui sera diffusé WM_SETTINGCHANGE.

Justin Dearing
la source
2
Il y a une liste d'autres outils (y compris pathed.exe) sur superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7
Ehtesh Choudhury
2

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.

Andrew Steitz
la source
Soyez prudent si vous avez utilisé fsutil.exe behavior set disable8dot3 1.
Andrew Morton
@AndrewMorton est un bon point, mais cela ne serait-il pas "manipulé" par le fait que le script ne "génère" pas le nom 8.3, il indique simplement le nom 8.3 attribué par le système de fichiers? Donc, si un dossier n’avait pas de nom 8.3, le script ne proposerait pas de substitut. Cependant, utiliser fsutil 8dot3name stripAPRES à l'aide du script causerait certainement des problèmes pour les dossiers affectés.
Andrew Steitz
Malheureusement, je n'ai pas de disque ou de système de rechange pour le vérifier. Cependant, après avoir utilisé un peu fsutil 8dot3name stripplus tôt aujourd'hui et considérant (a) qu'il vérifie d'abord le registre et (b) le chemin est stocké dans le registre, ma préoccupation antérieure peut être injustifiée, tant que l'utilisateur n'utilise pas l' /foption (force) .
Andrew Morton
2

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 )

Aminadav Glickshtein
la source
Le lien est maintenant cassé
Ivan
1
ATTENTION! Cela va éventuellement casser des choses, il va écrire %path%;c:\...[snip]...\7zdans la pathvariable utilisateur , en laissant tomber tout ce que vous aviez là.
Eugene Petrov
La variable d’environnement PATH utilisée par les programmes est une combinaison des variables machine et locales PATH. En plus de détruire les données actuelles dans le chemin local, je ne pense pas que cela puisse faire quelque chose. Avoir %path%dans la variable d'environnement de chemin local ne devrait avoir aucun effet.
Annan
0

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
fantastory
la source
1
Pouvez-vous expliquer un peu plus ce que vous suggérez ici?
G-Man dit 'Réintégrez Monica'
Il s’agit simplement d’une commande prête à l’emploi pour contourner la limite de 1024 caractères définie. L'exemple est montré directement sur la variable PATH. Bien que les réponses précédentes soient utiles, il leur manque une solution finale.
fantastory
0

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
Drazul
la source