Superando o limite de 1024 caracteres com o setx

63

Estou tentando definir variáveis de ambiente usando o comando setx , como segue

setx PATH "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;%PATH%"

No entanto, recebo o seguinte erro se o valor for maior que 1024 caracteres:

WARNING: The data being saved is truncated to 1024 characters.

SUCCESS: Specified value was saved.

Mas alguns dos caminhos no final não são salvos na variável, eu acho que devido ao limite de caracteres, como o erro sugere.

    
por Madhur Ahuja 08.02.2012 / 20:27

9 respostas

40

Sua melhor aposta é editar o registro diretamente.

Navegue até HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment e edite o valor Path (depois reinicialize para ativar o novo valor).

Observe que, embora você possa inserir um caminho muito longo, (até o comprimento máximo da variável de ambiente; 2.048 ou 32.768 bytes, dependendo da fonte, nem todo software será capaz de ler e manipular corretamente se for muito longo.

    
por 08.02.2012 / 20:48
25

se você estiver usando o Windows Vista ou superior, você pode fazer um symbolic link para a pasta. por exemplo:

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

criaria um link, então c:\pf seria sua pasta de arquivos de programa. Eu tirei 300 caracteres do meu caminho usando esse truque.

(Eu sei que não está relacionado ao setx, mas é útil para pessoas que estão procurando overcomming em 1024 char limit)

    
por 11.09.2014 / 09:46
13

Você pode usar um script do PowerShell semelhante ao seguinte:

$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');

A chamada de API Environment.SetEnvironmentVariable () transmitirá WM_SETTINGCHANGE então você não precisa reiniciar.

    
por 09.04.2012 / 04:07
6

Esta ferramenta de linha de comando SetEnv de código aberto é boa para editar o PATH e outras variáveis de ambiente sem limitações. Ele usa um buffer dinâmico, portanto, não há limitações estáticas como 1024.

link

A escolha de um% como um prefixo para anexar a uma variável poderia ter sido melhor, já que dificulta a sintaxe se usada com outras variáveis locais em lote ...

    
por 14.06.2012 / 17:23
4

Você pode colocar esta linha no seu BAT:

setx path "%%path%%;c:\drive\fr;c:\drive\installsz"

Veja o duplo %% .

(Referência: link )

    
por 21.04.2015 / 08:57
3

Uma ferramenta muito superior à setx para manipulação de caminhos é o pathed.exe . Infelizmente, está limitado a editar o caminho.

Além de uma experiência de usuário superior ao setx, você não tem um limite de 1024 caracteres. Ao contrário da manipulação direta do registro, esse aplicativo usa a chamada de API Environment.SetEnvironmentVariable () . que transmitirá WM_SETTINGCHANGE .

    
por 09.04.2012 / 04:00
2

Minha maneira favorita é alterar os nomes das pastas nas variáveis PATH para usar os nomes 8.3. Esta resposta do StackOverflow tem um script incrível (executado a partir de um arquivo .bat) que gerará a versão "minificada" de todo o arquivo. Variável PATH, que você pode colar nas caixas de diálogo Edit Variable (Editar). Apenas uma ressalva é que você precisará dividir as partes SYSTEM e USER. À medida que o script passa e descobre a versão reduzida de cada pasta, ele descarta e alerta você sobre qualquer caminho inválido / inexistente. Bom pequeno bônus de limpeza.

    
por 09.12.2015 / 20:04
0

se não for necessário manter o PATH do sistema e o PATH do usuário separados:

::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
    
por 24.10.2014 / 15:59
0

Eu acho que a melhor maneira é a próxima (com powershell) Com este caminho você também evita o litmit de 1024 caracteres.

Você pode ver o código em: link

#------------ 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
    
por 04.02.2016 / 16:38