90 votes

Dépasser la limite de 1024 caractères avec setx

J'essaie de définir des variables d'environnement à l'aide de la fonction setx comme suit

setx PATH "f : \common outils \git\bin ;f : \common outils \python\app ;f : \common outils \python\app\<strkeep>scripts<strkeep> ;f : \common outils \ruby\bin ;f : \masm32\bin ; F:\Borland\BCC55\Bin ;%PATH%"

Cependant, je reçois l'erreur suivante si la valeur est supérieure à 1024 caractères :

AVERTISSEMENT : Les données enregistrées sont tronquées à 1024 caractères.

SUCCES : La valeur spécifiée a été enregistrée.

Mais certains des chemins à la fin ne sont pas sauvegardés dans la variable, je suppose que cela est dû à la limite de caractères comme le suggère l'erreur.

2voto

Vous pouvez mettre cette ligne dans votre MTD :

setx path "%%path%%;c:\drive\fr;c:\drive\installs\7z"

Voir le double %% .

(Référence : https://support.microsoft.com/en-us/kb/75634 )

2voto

Andrew Steitz Points 121

Ma méthode préférée consiste à modifier les noms de dossiers dans les variables PATH pour utiliser les noms de la version 8.3. Cette réponse de StackOverflow a un script génial (exécuté à partir d'un fichier .bat) qui génère la version "minifiée" de la variable PATH entière, que vous pouvez ensuite coller dans le(s) dialogue(s) Edit Variable. La seule réserve est que vous devrez séparer les parties SYSTEM et USER. Au fur et à mesure que le script passe en revue et détermine la version réduite pour chaque dossier, il écarte et vous alerte de tout chemin invalide/non existant. Un joli petit bonus de nettoyage.

1voto

Badr Elmers Points 205

Un nouvel outil est né, il fonctionne très bien, a des caractéristiques uniques et résout tous les problèmes de setx : regenv

  • il fonctionne dans xp+.

  • c'est mieux que setx ,pathed, pathman, setenv

  • Il s'agit d'un dérivé de l'ancien outil setenv.

    set "var=D:\Bin"

    REM ::::: override a system var: regenv.exe set -nS c "%var%"

    REM ::::: append to a system var regenv.exe set -nS -sa c "%var%"

    REM ::::: preppend to a system var regenv.exe set -nS -sp c "%var%"

    REM ::::: create a variable that contains an unexpanded variable regenv.exe set -nS -sp c "%%var%%"

    REM ::::: edit PATH: if you edit PATH it is good to use -x , because -x will convert the reg type from REG_SZ to REG_EXPAND_SZ, because some tools may create a REG_SZ while the default reg type for PATH is/should be REG_EXPAND_SZ regenv.exe set -nS -sp -x PATH "%var%"

NB : si var contient un backslash à la fin, utilisez double retour de bâton :

regenv.exe set -nS c "D:\Bin\\"
REM gaves D:\Bin\

ou supprimer la dernière barre oblique inversée :

set "var=D:\Bin\"
REM -- Great example from Strawberry Perl's portable shell launcher:  this deletes the final backslash \.
if #%var:~-1%# == #\# set var=%var:~0,-1%
regenv.exe set -nS c "%var%"
:: gaves D:\Bin

il peut même créer des variables volatiles (HKCU \Volatile Environnement).

c'est vraiment un beau travail.

0voto

Drazul Points 101

Je pense que la meilleure façon est la suivante (avec powershell) Avec cette méthode, vous évitez aussi la litmitude du caractère 1024.

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

-1voto

Fantastory Points 99

S'il n'est pas nécessaire de maintenir séparés le PATH système et le PATH utilisateur :

::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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X