Я хотел бы знать, какие подходы вы используете для управления исполняемыми файлами в вашей системе. Например, у меня есть почти все доступное через командную строку, но теперь я дошел до предела строки пути, поэтому я не могу добавить больше dir.
Итак, что вы порекомендуете? Давным-давно я пытался использовать softLink-ы исполняемых файлов в Dir, которые принадлежали пути, но этот подход не работал . Бросить «только исполняемый файл» известный Dir, имеет проблемы с тем, что почти любому приложению требуется набор файлов, так что это тоже плохо . Бросьте исполняемый файл и все его файлы в известный Dir, ммм это будет работать, но возможность получить конфликт в имя файлов очень, очень высокое . Создать HardLink? я не знаю. Как вы думаете?
Один из способов, который я могу придумать, - это использовать другие переменные окружения для хранения частичных путей; например, если у вас есть
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%
В идеале вы должны точно знать, что делает каждая строка, прежде чем запускать ее.
Это проанализирует вашу переменную окружения% 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 в переменных окружения.
если вы используете Windows Vista или выше, вы можете сделать символическую ссылку на папку. например:
mklink /d C:\pf "C:\Program Files"
сделает ссылку, так что c:\pf
будет вашей папкой program files
. Используя этот трюк, я сбрил с пути 300 персонажей.
Если кому-то интересно ...
Я обнаружил, что мне никогда не нужны все эти пути одновременно, поэтому я создаю набор командных файлов «инициализации», которые соответствующим образом изменяют путь.
Например, если бы я хотел заняться разработкой 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%
Я считаю этот подход относительно чистым и до сих пор не сталкивался с какими-либо проблемами.
Как правило, мне не нужно беспокоиться об этом (я не сталкивался с ограничением размера пути - я даже не знаю, что это такое в современных системах Windows), но вот что я мог бы сделать, чтобы не помещать каталог программы в путь:
c:\util
, который находится по путив противном случае я добавлю простой cmd/batch-файл в каталог c:\util
, который будет выглядеть примерно так:
@"c:\program files\whereever\foo.exe" %*
который по сути создает псевдоним для команды. Это не обязательно идеально. Некоторые программы действительно настаивают на том, чтобы быть на пути (это довольно редко в настоящее время), а другие программы, которые пытаются вызвать его, могут не найти его должным образом. Но для большинства применений это работает хорошо.
Но в целом мне не приходилось беспокоиться о том, чтобы не добавлять каталоги в путь.
Другая идея: используйте DIR/X, чтобы определить короткие имена, сгенерированные для файла не-8dot3 Names. Затем используйте их в вашем% PATH%.
Например, «C:\Program Files» становится «C:\PROGRA ~ 1».
ИСПОЛЬЗУЙТЕ ключ реестра App Path вместо переменной path для специфичных для приложения путей:
http://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx
Я написал и использую каждый раз стандартный поток (stdin/stderr/stdout) и программу PROXY с кодом выхода (называемую dispatcher https://github.com/131/dispatcher ).
Все программы CLI, которые я использую (node, php, python, git, svn, rsync, plink ...), которые я использую, на самом деле являются одним и тем же exe-файлом (около 10 КБ, который я просто называю по-разному), который я помещаю в один и тот же файл. каталог. Фиктивный статический текстовый файл делает «имя файла прокси в реальном exe-отображении».
Диспетчер использует низкоуровневый API управления процессами win32, чтобы быть абсолютно прозрачным.
Используя это программное обеспечение, у меня есть только ОДИН дополнительный каталог, установленный в моем ПУТИ для всех программ, которые я мог бы использовать.
Создание папки c:\bin, добавление к вашему пути и жесткие ссылки, как вы сказали, могут сократить строку. Может быть, добавить системную переменную pf со значением c:\Program Files, а затем заменить c:\Program Files на% pf% в пути.
Правка:
Создать виртуальный диск . Subst p: "c:\program files"
Приведенные выше решения работают, только если вы можете урезать свой путь. В моем случае это не было возможным вариантом, и было сложно запускать скрипт каждый раз, когда я открывал командную строку. Поэтому я написал простой скрипт, который запускается автоматически при открытии командной строки и добавляет содержимое текстового файла к вашему пути.
Существуют также некоторые контексты, в которых запуск этого скрипта нарушает работу (скажем, в 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
или где бы вы ни сохранили командный файл выше.
Не пробовал, но будет ли разделять 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%
Я следую за этими шагами, чтобы сделать записи управляемыми:
Созданы разные пользователи для разных комбинаций использования пакетов программного обеспечения .. Пример. (A) Создан пользовательский веб-сайт для обеспечения доступности всего программного обеспечения для веб-разработки; (b) Создана пользовательская база данных для предоставления доступа ко всем программным пакетам базы данных и хранилищ данных. Помните, что некоторые программы могут создавать более одной записи. Или когда-нибудь я разбиваю это на конкретных Oracle, MSSQL и Oracle. Я поместил MySQL/PostgreSQL, Tomcat, wamp, xamp все в учетную запись пользователя webr.
Если возможно, установите общие пакеты, такие как office, photoshop, .. как системные, доступные для всех пользователей, и специальные пакеты как пользовательские. Конечно, мне пришлось войти в систему разных пользователей и установить их. Не все программное обеспечение может предоставить эту опцию. Если опция «установить только для этого пользователя» недоступна, установите ее для всей системы.
Я избегаю установки программ в папку 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. В общем, сократите ссылку как можно больше.
Включите любой пакет для замены сокращенной ссылки на путь, если все вышеперечисленные шаги прошли ограничение Windows.
Затем войдите в систему для конкретного пользователя (мобильное приложение, база данных/хранилище данных или веб-разработка ...) и выполните соответствующие задачи.
Вы также можете создавать виртуальные окна внутри окон. Пока у вас есть одна лицензионная копия ОС, возможно создание нескольких виртуальных окон с одним и тем же ключом. Вы можете поместить пакеты, специфичные для конкретной задачи, на этом компьютере. Вы должны запускать отдельный VM каждый раз. Некоторые пакеты с интенсивным использованием памяти, такие как создатели 3D-анимационных фильмов, должны быть помещены на основной компьютер, а не в VM, поскольку VM будет иметь только часть RAM, доступную для его использования. Хотя загружать каждый VM очень сложно.