Как избежать переполнения переменной среды PATH в Windows?


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

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

12 104

12 ответов:

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

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;

EDIT: другой вариант-создать держит .bat файлы, которые указывают на соответствующий .exe файлы.

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

EDIT 3: этот простой тест заставляет меня поверить Бен Фойгта является правильным.

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

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

EDIT 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%

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

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

@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!

возьмите выходные данные и обновите переменную пути в переменных среды.

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

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

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

в случае, если кому надо...

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

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

> initmingw
> initeclipse
> eclipse

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

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

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

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

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

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

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

например, 'C:\Program файлы" становится "C:\PROGRA~1'.

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

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

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

Edit:

создать виртуальный диск. подстанция Р: "c:\program файлы"

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

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

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

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

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

  1. созданы разные пользователи для использования различных комбинаций программных пакетов. Пример: а) создание пользовательского веб-сайта для обеспечения доступности всего программного обеспечения для веб-разработки; б) создание пользовательской базы данных для обеспечения доступности всех пакетов программного обеспечения для баз данных и хранилищ данных. Помните, что некоторые программы могут создавать более одной записи. Или когда-нибудь я разбиваю это на oracle specific и MSSQL specific и oracle отдельные пользователи. Я поместил MySQL / PostgreSQL, tomcat, wamp, xamp все в учетную запись пользователя webr.

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

  3. I избегайте установки программ в папку Program File (x86) или в файл программы. Я всегда устанавливаю в базовый каталог. Например, MySQL 64 бит входит в "C:\mysql64" и MySQL 32 бит входит в "C:\mysql-папка. Я всегда предполагаю добавление суффикса 64 только для 64-битного программного обеспечения. Если суффикса нет, то это 32 бит. Я следую за тем же самым для Java и других. Таким образом, мой путь будет короче, не включая "C:\Program файл (x86)". Для некоторых программ файл конфигурации может потребоваться отредактировать показать, где именно .EXE файл. Только программа, которая требует установки в "C:\Program файл (x86)" будет установлен в эту папку. Я всегда помню, что нужно сокращать имена. Я избегаю номер версии, как tomcat / release / version-2.5.0.3 такие детали. Если мне нужна версия know, Я создаю файл по имени version и помещаю его в папку tomcat. В общем сократите ссылку как можно больше.

  4. включить любой пакет для замены сокращенной ссылки на путь, если все вышеперечисленные шаги прошли предел Windows.

затем войдите в специфику использования (мобильное приложение, база данных/хранилище данных или веб-разработка.. ..) пользователь и выполнять соответствующие задачи.

вы также можете создавать виртуальные окна в windows. Пока у вас есть одна лицензионная копия ОС, возможно создание нескольких виртуальных окон с одним и тем же ключом. Вы можете поместить пакеты, определенные для конкретной задачи на этой машине. Вы должны запустить отдельную виртуальную машину каждый время. Некоторые пакеты с интенсивной памятью, такие как 3D animation movie makers, должны быть помещены в основную машину, а не в VM, поскольку VM будет иметь только часть оперативной памяти, доступной для ее использования. Это боль для загрузки каждой виртуальной машины, хотя.

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

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

@echo off

:: Modify these to the actual paths of these two files
set dontSetupFile=C:\Users\Yams\Dontsetup.txt
set pathFile=C:\Users\Yams\Path.txt

:: Retrieve the current path (for determining whether or not we should append to our path)
set curDir=%cd%

:: Be done if the current path is listed in the dontSetupFile
SetLocal EnableDelayedExpansion
for /F "delims=" %%i in (%dontSetupFile%) do (
    if "%%i"=="%curDir%" GOTO AllDone
)



:: Append the pathFile to our current PATH
set pathAppend=
for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i)

set PATH=%PATH%;%pathAppend%


:: The only way to actually modify a command prompt's path via a batch file is by starting
::   up another command prompt window. So we will do this, however, if this script is
::   automatically called on startup of any command prompt window, it will infinately 
::   recurse and bad things will happen.

:: If we already ran, we are done
if "%yams%"=="onion" GOTO AllDone

:: Otherwise, flag that we just ran, and then start up a new command prompt window
::   with this flag set
set yams=onion

cmd \K set PATH=%PATH%;

:: When that command prompt exits, it will load back up this command prompt window, and
::   then the user will need to exit out of this as well. This causes this window to
::   automatically exit once the cmd it just spawned is closed.
exit()

:: Path is set up, we are done!
:AllDone
@echo on

И Пути.txt будет выглядеть примерно так

C:\Program Files (x86)\Google\google_appengine;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\Microsoft SQL Server0\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits.0\Windows Performance Toolkit;

Пока Dontsetup.txt будет выглядеть примерно так

C:\Program Files (x86)\Windows Kits.0\Windows Performance Toolkit
C:\Program Files (x86)\Git\cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

чтобы сделать этот запуск автоматически при запуске, откройте regedit, перейдите к HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Command Processor, затем щелкните правой кнопкой мыши справа и нажмите new -> Multi-String Значение. Назовите его автозапуск. Установите его значение в

C:\Users\Yams\setUpPath.bat

или где еще вы сохранили пакетный файл выше.

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

пример изначально предположим, что у вас есть что-то вроде

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%