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

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

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

Ответ 1

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

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: Другой вариант - создать каталог bin, содержащий файлы .bat, которые указывают на соответствующие файлы .exe.

EDIT 2: Комментарий Ben Voigt к другому ответу упоминает, что использование других переменных среды, как было предложено, может не уменьшить длину %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%

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

Ответ 2

Это проанализирует вашу переменную окружения% 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 в переменных среды.

Ответ 3

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

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

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

Ответ 4

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

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

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

> initmingw
> initeclipse
> eclipse

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

Мои пакетные файлы обычно выглядят следующим образом:

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 8

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

Edit:

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

Ответ 9

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

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

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

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

Ответ 10

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

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

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

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

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

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

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

Ответ 11

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

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

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

И Path.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 Server\110\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;

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

C:\Program Files (x86)\Windows Kits\8.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 Value. Назовите его AutoRun. Задайте значение

C:\Users\Yams\setUpPath.bat

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

Ответ 12

Не пробовал, но разделил бы 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%