Почему я могу выполнить программу, которая не входит в переменную окружения PATH?


9

Я задавался вопросом, почему команда java -versionявляется глобально доступной?

Я мог бы запустить его из любого каталога и он работает:

введите описание изображения здесь

Как это работает?

Вот как PATHвыглядит моя системная переменная:

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

Как по мне, java.exeнаходится в%programfiles%\java\jre7\bin


2
Смотрите здесь .
Даниэль Бек

У меня нет подробностей на данный момент, поэтому это комментарий, а не ответ, но если java.exe(или java.comи т. Д.) Нет в вашей, PATHесть другая запись реестра, которая может указывать пути к исполняемым файлам.
Марк Херд

1
@MarkHurd cmd (и CreateProcess) не проверяет запись реестра App Paths, а только ShellExecute [и, следовательно, диалог Run].
Random832

@MarkHurd, как вы и ожидали, это не в моей переменной пути ..
Pacerier

1
@Pacerier Исполняемый файл Java находится в% SystemRoot% \ System32 \
Дуэйн Хинтерланг

Ответы:


13

Как правило, существует группа каталогов, где исполняемые файлы, которые многократно используются, должны быть найдены вашей Windows, но на практике нет конкретной причины использовать команду как глобальную или нет. Разработчики использовали его как «глобальный», где бы он ни захотел, он может это сделать. Если вы хотите использовать какую-либо команду как «глобальную», вам необходимо добавить ее в качестве «Переменной среды Windows» . Для этого вы можете использовать следующие методы :

  1. Добавление вручную с помощью «Свойства системы Windows»: введите описание изображения здесь

  2. Используя дополнительный инструмент Setx.exe:

Он не является частью стандартной установки Windows XP, но средство командной строки setx.exe входит в состав средств поддержки Windows XP с пакетом обновления 2 (SP2). Этот инструмент расширяет команду set, чтобы сделать постоянные изменения в переменных среды. Например, чтобы добавить папку C: \ New Folder в путь, команда

setx path "%PATH%;C:\New Folder" 
  1. Скрипты для перечисления переменных среды:

Команда «Установить» может использоваться в командной строке вместе с перенаправлением в текстовый файл для составления списка текущих переменных среды. Команда может быть

set > C:\env_list.txt 

Имя файла «C: \ env_list.txt» можно заменить любым по вашему выбору.

У Microsoft также есть VBScript, который перечисляет переменные среды на этой странице .

  1. Ключи реестра для переменных среды:

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

HKEY_CURRENT_USER\Environment

Системные переменные находятся в ключе:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Обратите внимание, что любая переменная среды в форме, которую необходимо развернуть (например,% PATH%), должна храниться в реестре как значение реестра REG_EXPAND_SZ. Редактирование реестра в основном для сценариев, используемых системными администраторами, и не рекомендуется для обычного пользователя ПК.

Вы можете найти больше информации об этом здесь.


1
Тем не менее, java.exe находится в %programfiles%\java\jre7\bin. Эта папка не отображается в переменной Path моей системы ..
Pacerier

7
Java.exe также находится в папке% SystemRoot% \ System32 \, который отображается в переменной PATH
Дуэйн Хинтерланг,

5

«Глобальные команды» определяются переменными среды.

В зависимости от того, какую операционную систему вы используете, она может быть разной.

Наиболее общий способ заключается в

Щелкните правой кнопкой мыши «Мой компьютер», выберите «Свойства»

В Windows7 вам нужно будет выбрать «Расширенные настройки системы» на панели слева.

Открыв диалоговое окно «Свойства системы», выберите вкладку «Дополнительно».

Внизу есть кнопка «Переменные среды»

В диалоге переменных среды вы сможете настроить переменные среды для пользователя или для всей системы.

Например, системная переменная «Упрощенный путь» будет выглядеть примерно так ...

C: \ Program Files \ Java \ jre6 \ bin ; C: \ Ruby19 \ bin;

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

Причина, по которой вы можете вызывать calc, mspaint, cmd все из диалогового окна Run, заключается в том, что C: \ windows \ system32 находится в переменной среды Path.

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

Затем вы можете запустить исполняемый файл с этого пути непосредственно в командной строке, не вводя весь путь, как команда java -version.

Для получения дополнительной информации см. Следующие ссылки ...

Переменные среды

Понимать и настраивать переменные среды

Поиск Java.exe при новой установке


3

Вот простой whichпример, который отображает все попадания команд в PATH для текущих расширений PATHEXT:

@for %%I in ("%path:;=\" "%") do @for %%E in (%pathext:;= %) do @if exist "%%~dpI%1%%E" @echo %%~dpI%1%%E

Поместите это where.cmd(позволяя whichприйти откуда-то еще, если вы получите это!) И позвоните с where java.

Теперь, в моем комментарии выше, я предположил, что если javaон не появляется в вашем PATH, вы можете проверить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths [ref] , но после того, как вы на самом деле попытаетесь это сделать, он не будет работать с командной строкой, только с ShellExecuteExтакими вещами , как Start Run. и команда startCLI.


2

Когда вы вводите команду, оболочка просматривает переменную среды с именем PATH (% PATH%, $ PATH в зависимости от ОС). Он запрашивает каждый каталог в переменной PATH, чтобы узнать, встречает ли он исполняемый файл, который соответствует введенной вами команде. Первый найденный будет выполнен.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.