Выполняет ли командная строка Windows поиск в других местах, кроме тех, которые указаны переменной PATH при запуске прикладных программ?

35

Я попробовал следующий эксперимент.

Прежде чем начать, я проверил переменную PATH из cmd, которая имеет следующее значение:

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

Сначала я подумал, что cmd ищет только исполняемые файлы в каталогах, содержащихся в переменной PATH, поэтому я случайно выбрал приложение - winword.exe (Microsoft Word) и попытался запустить его из командной строки:

start winword

Но, к моему удивлению, программа запускается! Причина, по которой я удивлен, заключается в том, что я искал во всех каталогах переменной PATH exe-файл с именем «winword», но все мои поиски оказались пустыми!

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

Очевидно, что в следующий раз я искал точное место, где находится исполняемый файл winword. Оказывается, что winword.exe находится здесь:

C:\Program Files\Microsoft Office 15\root\office15

Следовательно, дает мне идею, что, возможно, CMD автоматически просматривает ProgramFiles и ProgramFiles (x86) (и все их подкаталоги) при выполнении команды start? В результате я попытался запустить другое приложение, установленное на моем компьютере, Audacity, с файлом exe, расположенным по адресу:

C:\Program Files (x86)\Audacity

Опять же, к моему удивлению, Audacity не удалось запустить, когда я набрал:

start audacity

в командной строке.

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

Затем я добавил каталог, содержащий audacity.exe в PATH:

set path=%path%;C:\Program Files (x86)\Audacity

после чего я снова попытался запустить Audacity:

start audacity

Неудивительно, что Audacity запущен.

Я хочу знать, где именно командная строка ищет исполняемые файлы? Почему winword.exe запускается, даже если каталог, содержащий его, не является частью PATH, но то же самое не относится к audacity.exe?

Я пробовал другие приложения тоже. Chrome и Firefox работает, когда я использую команду запуска.

ОБНОВЛЕНИЕ: я использую версию Windows 6.3.9600 (Windows 8.1)

Энтони
источник

Ответы:

44

Сначала я подумал, что cmd ищет только исполняемые файлы в каталогах, содержащихся в переменной PATH, поэтому я случайно выбрал приложение - winword.exe (Microsoft Word) и попытался запустить его из командной строки:

Причина в winword.exeтом, что существует раздел реестра, который определяет путь к Microsoft Word (Winword.exe). Аналогичный ключ существует для Firefox.exe и Chrome.exe, если эти приложения установлены.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

Я хочу знать, где именно командная строка ищет исполняемые файлы?

Переменная PATH системы, переменная PATH пользователя и различные ключи внутри ..\App Paths. Мне удалось подтвердить, что Audacity не создает ключ для себя, когда он установлен.

Когда функция ShellExecuteEx вызывается с именем исполняемого файла в его параметре lpFile, есть несколько мест, где функция ищет файл. Мы рекомендуем зарегистрировать ваше приложение в разделе реестра «Пути к приложениям». Это избавляет приложения от необходимости изменять системную переменную среды PATH.

  • Текущий рабочий каталог.
  • Только каталог Windows (подкаталоги не ищутся).
  • Каталог Windows \ System32.
  • Каталоги, перечисленные в переменной среды PATH.
  • Рекомендуется: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Пути к приложениям

Источник: Регистрация приложения

Ramhound
источник
15

Из командной строки, если вы просто введете WinWordего, он не запускается.

Если вы введете START WinWordэто работает.

Команда Startявляется ключевой здесь.

При попытке выполнить файл с помощью команды запуска командная строка не выполняет поиск. Вместо этого он передает имя файла (и аргументы) самой Windows (через вызов API ShellExecuteEx), который затем должен найти местоположение файла. Есть несколько мест, где он ищет в следующем порядке:

  • Текущий рабочий каталог.

  • Только Windowsкаталог (без подкаталогов ищется).

  • Windows\System32Каталог.

  • Каталоги, перечисленные в PATHпеременной среды.

  • Рекомендуемые:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordнаходится в этом разделе реестра. Ключ, чтобы PATHизбежать слишком длинного.

Larryc
источник
7
Пожалуйста, приведите и процитируйте все источники. Если вы не написали порядок поиска по памяти, вам следовало бы сослаться на свой источник, в котором указывался список и порядок его поиска.
Ramhound
Источником будут мои заметки о чем-то, над чем я работал пару лет назад. Я не знаю, где я взял это тогда, веб-страницы приходят и уходят.
Ларрик
5
Вы получили их из той же документации, что и все остальные.
Ramhound
7

Программа (когда вы указываете имя модуля без диска / пути в командной строке) в командном процессоре Windows (CMD.EXE) может быть запущена при обнаружении:

  • по переменной среды PATH (как исполняемый файл, так и его hardlink / softlink / shortcut с тем же именем)

  • по псевдониму DOSKEY

  • по пути приложения от HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathsили HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(при использовании startкоманды)

Используя эти знания (особенно последние), вы можете создавать собственные псевдонимы, удобные для вас. Например, вы можете создать HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exeсо значением по умолчанию C:\Program Files (x86)\Audacity\Audacity.exeи запустить это приложение, просто набрав start auв командной строке.

Акина
источник
0

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

Вы специально сказали, что искали файлы с расширением exe. Windows также попытается выполнить файлы других расширений.

Другой переменной среды, которая вступает в игру при выполнении команды, является переменная PATHEXT. Это ;ограниченный список расширений файлов, которые нужно попытаться выполнить. Если вы слышите эхо, PATHEXTвы можете увидеть что-то вроде .COM;.EXE;.BAT;.CMD;.VBS;... (и т. Д.). Некоторые приложения используют эти другие типы файлов в качестве точки входа конечного пользователя. Это гораздо реже, но это случается. Я использовал несколько крупных коммерческих продуктов, которые начинаются со .BATсценариев. Чтобы использовать один из них в качестве примера, я могу запустить его с помощью команды, standaloneхотя ее нет standalone.exe... вместо этого она имеет standalone.bat.

Некоторые из расширений, которые PATHEXTя сейчас смотрю, у меня никогда не было приложений. Те , которые я уже столкнулись с гораздо более часто (но , очевидно , не столько , сколько exe) , являются: .com, .bat, .vbs, .js, .jar. Первые два представляют собой файлы пакетных сценариев Windows, а остальные три представляют собой типы файлов для определенных языков программирования, которые запускаются из сценариев или виртуальных машин вместо exes (соответственно: Visual Basic, Javascript и Java).

Loduwijk
источник
Забота о том, чтобы прокомментировать (я знаю, что спрашивать обычно бесполезно, но иногда я получаю ответ)? Я где-то ошибся?
Лодувийк
Не я, но по дикой догадке, потому что, хотя PATHEXTи PATH, и оба связаны с тем, чтобы все заработало, они несколько ортогональны в своих задачах. PATHуказывает, где искать объекты для выполнения, и является тем, о чем спрашивал OP, а также PATHEXTуказывает, что можно запустить.
dgnuff
@dgnuff Интересно, так как это была моя точка зрения: OP определенно сформулировал вопрос таким образом, чтобы просить о фреймовом вызове ... с точки зрения SE, они задавали «XY вопрос», предполагая, что запускаемый файл не был в местах, которые уже искали на пути. В любом случае, спасибо.
Лодувийк
0

start winwordне говорит командную строку для запуска winword. Он сообщает командной строке для запуска startс аргументом winword. Startиспользует свои собственные методы для поиска winword.

Просто winwordговорит командную строку для запуска winword. И если вы попробуете это, так winwordкак не на PATH, он не запускается.

Эрик Тауэрс
источник