it-swarm.xyz

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

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

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

106
mjsr

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

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: В комментарии Бена Фойгта к другому ответу упоминается, что использование других предложенных переменных среды может не уменьшить длину %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%

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

81
Mitch Schwartz

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

77
Todd Smith

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

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

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

27
bmg002

Если кому-то интересно ...

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

Например, если бы я хотел заняться разработкой 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%

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

10
YellPika

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

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

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

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

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

6
Michael Burr

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

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

5
Android Eve

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

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

5
Mad Hatter

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

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

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

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

1
131

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

Правка:

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

1
troynt

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

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

@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

И 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

или где бы вы ни сохранили командный файл выше. 

0
Phylliida

Не пробовал, но будет ли разделять 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%
0
Philipp Munin

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

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

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

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

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

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

Вы также можете создавать виртуальные окна внутри окон. Пока у вас есть одна лицензионная копия ОС, возможно создание нескольких виртуальных окон с одним и тем же ключом. Вы можете поместить пакеты, специфичные для конкретной задачи, на этом компьютере. Вы должны запускать отдельный VM каждый раз. Некоторые пакеты с интенсивным использованием памяти, такие как создатели 3D-анимационных фильмов, должны быть помещены на основной компьютер, а не в VM, поскольку VM будет иметь только часть RAM, доступную для его использования. Хотя загружать каждый VM очень сложно.

0
Dr. A. Anukanth