Как избежать переполнения переменной среды PATH в Windows?
Я хотел бы знать, какие подходы вы используете для управления исполняемыми файлами в вашей системе. Например, у меня есть почти все, что доступно через командную строку, но теперь я прихожу к пределу строки пути, поэтому я не могу добавить больше dir.
Так что же вы рекомендуете? Давным-давно я пытался использовать softLinks исполняемых файлов в Dir, который принадлежал пути, но этот подход не сработал. Бросьте "только исполняемый файл" в известный каталог, имеет проблемы, которые почти любое приложение требует набора файлов, так что это тоже плохо. Бросьте исполняемый файл и все его файлы в известный каталог, МММ это будет работать, но возможность получить конфликт в имени файлов очень и очень высока. Создать жесткую ссылку? я не знаю. А ты как думаешь?
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, чтобы быть абсолютно прозрачным.
используя это программное обеспечение, у меня есть только один дополнительный каталог, установленный в моем пути для всех программ, которые я мог бы использовать.
Я выполняю следующие действия, чтобы сделать записи управляемыми:
созданы разные пользователи для использования различных комбинаций программных пакетов. Пример: а) создание пользовательского веб-сайта для обеспечения доступности всего программного обеспечения для веб-разработки; б) создание пользовательской базы данных для обеспечения доступности всех пакетов программного обеспечения для баз данных и хранилищ данных. Помните, что некоторые программы могут создавать более одной записи. Или когда-нибудь я разбиваю это на oracle specific и MSSQL specific и oracle отдельные пользователи. Я поместил MySQL / PostgreSQL, tomcat, wamp, xamp все в учетную запись пользователя webr.
Если возможно, установите общие пакеты, такие как office, photoshop,.. как специфическая система, доступная для всех пользователей, и специальные пакеты как специфичные для пользователя. Конечно, мне пришлось войти в разных пользователей и установить их. Не все программное обеспечение может обеспечить эту опцию. Если опция "установить только для этого пользователя" недоступна, установите ее для всей системы.
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. В общем сократите ссылку как можно больше.
включить любой пакет для замены сокращенной ссылки на путь, если все вышеперечисленные шаги прошли предел 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%