Как избежать переполнения переменной среды PATH в Windows? - PullRequest
111 голосов
/ 10 декабря 2010

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

Так что вы рекомендуете? Давным-давно я пытался использовать программные ссылки исполняемых файлов в Dir, которые принадлежали пути, но этот подход не работал. Выдает «только исполняемый файл» известному Dir, имеет проблемы с тем, что практически любому приложению требуется набор файлов, так что это тоже плохо. Бросьте исполняемый файл и все его файлы в известный Dir, ммм это будет работать, но вероятность получить конфликт в имени файлов очень и очень высока. Создать HardLink? я не знаю. Что ты думаешь?

Ответы [ 12 ]

82 голосов
/ 10 декабря 2010

Один из способов, который я могу придумать, - это использовать другие переменные окружения для хранения частичных путей;например, если у вас есть

C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;

, вы можете создать новую переменную среды, такую ​​как

SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places

, после чего ваши исходные пути станут

%P1%\subdir1;
%P1%\subdir2;

РЕДАКТИРОВАТЬ: Другой вариант заключается в создании каталога bin, который содержит .bat файлов, которые указывают на соответствующие .exe файлы.

РЕДАКТИРОВАТЬ 2: Бен Voigt'sВ комментарии к другому ответу упоминается, что использование других переменных среды, как предлагается, может не уменьшить длину %PATH%, поскольку они будут расширены перед сохранением.Это может быть правдой, и я не проверял это.Другой вариант - использовать формы 8dot3 для более длинных имен каталогов, например, C:\Program Files обычно эквивалентно C:\PROGRA~1.Вы можете использовать dir /x, чтобы увидеть более короткие имена.

РЕДАКТИРОВАТЬ 3: Этот простой тест заставляет меня поверить, что Бен Фойгт прав.

set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%

НаВ конце этого вы увидите вывод hellohello, а не byehello.

РЕДАКТИРОВАТЬ 4: В случае, если вы решите использовать пакетные файлы для исключения определенных путей из %PATH%, вы можетезаботиться о том, как передать аргументы из вашего пакетного файла в ваш исполняемый файл, чтобы процесс был прозрачным (то есть вы не заметите никакой разницы между вызовом пакетного файла и вызовом исполняемого файла).У меня нет большого опыта написания командных файлов, но это, кажется, работает нормально.

@echo off

rem This batch file points to an executable of the same name
rem that is located in another directory. Specify the directory
rem here:

set actualdir=c:\this_is\an_example_path

rem You do not need to change anything that follows.

set actualfile=%0
set args=%1
:beginloop
if "%1" == "" goto endloop
shift
set args=%args% %1
goto beginloop
:endloop
%actualdir%\%actualfile% %args%

Как правило, вы должны быть осторожны при запуске командных файлов из Интернета, так как вы можетеделайте все с помощью пакетных файлов, например форматируйте жесткий диск.Если вы не доверяете приведенному выше коду (который я написал), вы можете проверить его, заменив строку

%actualdir%\%actualfile% %args%

на

echo %actualdir%\%actualfile% %args%

В идеале вы должны точно знать, что каждая строкаделает, прежде чем запустить его.

79 голосов
/ 04 декабря 2013

Это проанализирует вашу переменную окружения% PATH% и преобразует каждый каталог в его эквивалент короткого имени, а затем объединит все вместе:

@echo off

SET MyPath=%PATH%
echo %MyPath%
echo --

setlocal EnableDelayedExpansion

SET TempPath="%MyPath:;=";"%"
SET var=
FOR %%a IN (%TempPath%) DO (
    IF exist %%~sa (
        SET "var=!var!;%%~sa"
    ) ELSE (
        echo %%a does not exist
    )
)

echo --
echo !var:~1!

Возьмите выходные данные и обновите переменную PATH в переменных окружения.

28 голосов
/ 09 сентября 2014

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

mklink /d C:\pf "C:\Program Files"

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

10 голосов
/ 29 июля 2012

В случае, если кому-то интересно ...

Я считаю, что мне никогда не нужны все эти пути сразу, поэтому я создаю кучу пакетных файлов "инициализации", которые соответствующим образом изменяют путь.

Например, если бы я хотел заняться разработкой C ++ в Eclipse, я бы сделал:

> initmingw
> initeclipse
> eclipse

Это также удобно для предотвращения конфликтов между исполняемыми файлами с одинаковыми именами (такими как компиляторы C ++ и D,у обоих есть make.exe).

Мои командные файлы обычно выглядят так:

@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%

Я считаю этот подход относительно чистым и до сих пор не сталкивался с какими-либо проблемами.

6 голосов
/ 10 декабря 2010

Мне обычно не нужно беспокоиться об этом (я не сталкивался с ограничением размера пути - я даже не знаю, что это такое в современных системах Windows), но вот что я мог бы сделать, чтобы избежать установкиКаталог программы по пути:

  • Большинство утилит командной строки выбрасываются в каталог c:\util, который находится по пути
  • , в противном случае я добавлю простой cmd /командный файл в каталог c:\util, который выглядит примерно так:

    @"c:\program files\whereever\foo.exe" %*
    

, который по существу создает псевдоним для команды.Это не обязательно идеально.Некоторые программы действительно настаивают на том, чтобы быть на пути (это довольно редко в настоящее время), а другие программы, которые пытаются вызвать его, могут не найти его должным образом.Но для большинства применений это работает хорошо.

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

5 голосов
/ 01 октября 2013

ИСПОЛЬЗУЙТЕ ключ реестра App Path вместо переменной path для путей к приложениям:

http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

5 голосов
/ 10 декабря 2010

Еще одна идея: использовать DIR / X для определения коротких имен, сгенерированных для файла не-8dot3 имена. Затем используйте их в вашем% PATH%.

Например, «C: \ Program Files» становится «C: \ PROGRA ~ 1».

1 голос
/ 19 августа 2015

Я каждый раз писал и использую стандартную программу (stdin / stderr / stdout) и код выхода PROXY (она называется диспетчер https://github.com/131/dispatcher)

Все программы CLI, которые я использую (node, php, python, git, svn, rsync, plink ...), которые я использую, на самом деле являются одним и тем же exe-файлом (около 10 КБ, который я просто называю по-другому), который я помещаю в том же каталоге. Пустой статический текстовый открытый файл выполняет «сопоставление имени файла прокси с реальным исполняемым файлом».

Диспетчер использует низкоуровневый API управления процессами win32, чтобы быть абсолютно прозрачным.

Используя это программное обеспечение, в моем ПУТИ установлен только ОДИН дополнительный каталог для всех программ, которые я могу использовать.

1 голос
/ 10 декабря 2010

Создание папки c: \ bin, добавление к вашему пути и жесткие ссылки, как вы сказали, может сократить строку.Может быть, добавить системную переменную pf со значением c: \ Program Files, а затем заменить путь c: \ Program Files на% pf% в пути.

Изменить:

Создать виртуальный диск.subst p: "c: \ program files"

0 голосов
/ 29 января 2016

Не пробовал, но будет ли разделять PATH на части и объединять их в окончательную переменную?

Пример, скажем, у вас есть что-то вроде

PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}

Вместо этого вы создаете:

_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char}
_PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N}
rem // may be more parts
PATH = %_PATH1%;%_PATH2%
...