67

Я пытаюсь установить переменные окружения с помощью команды setx , например:

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\ бен; F:\ Borland\ BCC55\ Bin;% PATH%»

Тем не менее, я получаю следующую ошибку, если значение превышает 1024 символа:

ВНИМАНИЕ: Сохраняемые данные усекаются до 1024 символов.

УСПЕХ: Указанное значение было сохранено.

Но некоторые пути в конце не сохраняются в переменной, я думаю, из-за ограничения символов, как предполагает ошибка.

9 ответов9

45

Лучше всего редактировать реестр напрямую.

Перейдите к HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment и измените значение Path (затем перезагрузите компьютер, чтобы активировать новое значение).

Однако обратите внимание, что, хотя вы можете ввести очень длинный путь (до максимальной длины переменной среды; 2048 или 32 768 байт в зависимости от источника), не все программное обеспечение сможет правильно читать и обрабатывать его, если он слишком длинный.

27

Если вы используете Windows Vista или выше, вы можете сделать symbolic link на папку. например:

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

создаст ссылку, поэтому c:\pf будет папкой ваших программных файлов. Используя этот трюк, я сбрил с пути 300 персонажей.

(Я знаю, что это не связано с setx, но это полезно для людей, которые ищут overcomming на пределе 1024 символа)

15

Вы можете использовать скрипт PowerShell, подобный следующему:

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

Окружающая средаВызов API SetEnvironmentVariable() будет транслировать WM_SETTINGCHANGE поэтому вам не нужно перезагружаться.

7

Этот инструмент командной строки SetEnv с открытым исходным кодом хорош для редактирования PATH и других переменных среды без ограничений. Он использует динамический буфер, поэтому нет статических ограничений, таких как 1024.

http://www.codeproject.com/Articles/12153/SetEnv

Выбор% в качестве префикса для добавления к переменной мог бы быть лучше, хотя это иногда затрудняет синтаксис при использовании с другими пакетными локальными переменными ...

4

Pathed.exe - гораздо лучший инструмент, чем setx, для манипулирования путями. К сожалению, это ограничено редактированием пути.

В дополнение к превосходному пользовательскому опыту, чем setx, у вас нет ограничения в 1024 символа. В отличие от прямых манипуляций с реестром, это приложение использует среду.Вызов API-интерфейса SetEnvironmentVariable(), который будет транслировать WM_SETTINGCHANGE.

3

Вы можете поместить эту строку в вашу BAT:

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

Смотрите двойное %% .

(Ссылка: https://support.microsoft.com/en-us/kb/75634)

2

Мой любимый способ - изменить имена папок в переменных PATH, чтобы использовать имена 8.3. Этот ответ StackOverflow содержит потрясающий скрипт (запускаемый из файла .bat), который сгенерирует "минимизированную" версию всей переменной PATH, которую затем можно вставить в диалоговое окно "Изменить переменную". Единственное предостережение в том, что вам нужно разделить части SYSTEM и USER. Когда скрипт проходит и выясняет минимизированную версию для каждой папки, он отбрасывает и предупреждает вас о любых неверных / несуществующих путях. Милый маленький бонус за уборку.

0

Я думаю, что лучший способ - следующий (с PowerShell). Таким образом, вы также избегаете мельчайших 1024 символов.

Вы можете увидеть код на: 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
0

если не требуется разделять системный PATH и пользовательский PATH:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .