Преодоление ограничения в 1024 символа с помощью setx

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

setx путь "f:common toolsgitbin;f:common
инструментыпитонаприложения;f:common инструментыпитонаскрипты приложения; f:common
инструменты\Руби ОГРН;f:masm32bin;F:BorlandBCC55Bin;%путь%"

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

предупреждение: сохраняемые данные усекаются до 1024 письмена.

успех: заданное значение было сохранено.

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

27
задан Justin Dearing
10.03.2023 19:27 Количество просмотров материала 3263
Распечатать страницу

9 ответов

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

перейти к HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment редактировать Path value (перезагрузка для активации нового значения).

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

40
отвечен Synetech 2023-03-12 03:15

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

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

сделал бы ссылку так c:\pf будет ваша папка program files. Я сбрил 300 символов с моего пути, используя этот трюк.

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

25
отвечен RezaRahmati 2023-03-12 05:32

можно использовать сценарий 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');

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

13
отвечен Justin Dearing 2023-03-12 07:49

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

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

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

6
отвечен Kharlos Dominguez 2023-03-12 10:06

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

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

посмотреть %%.

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

4
отвечен Aminadav Glickshtein 2023-03-12 12:23

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

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

3
отвечен Justin Dearing 2023-03-12 14:40

мой любимый способ-изменить имена папок в переменных пути, чтобы использовать имена 8.3. этот ответ StackOverflow имеет удивительный сценарий (запустить из .bat-файл), который будет генерировать "уменьшенную" версию всей переменной PATH, которую затем можно вставить в диалоговые окна редактирования переменных. Единственное предостережение заключается в том, что вам нужно будет разделить системные и пользовательские части. По мере того, как скрипт проходит и выясняет минимизированную версию для каждой папки, он отбрасывает и предупреждает Вы любых недопустимых / несуществующих путей. Небольшой бонус за уборку.

2
отвечен Andrew Steitz 2023-03-12 16:57

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

::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
0
отвечен fantastory 2023-03-12 19:14

Я думаю, что лучший способ-это следующий (с powershell) С этим путем также вы избегаете litmit 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
отвечен Drazul 2023-03-12 21:31

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх