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

3698
Anthony

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

Прежде чем начать, я проверил переменную 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 

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

enter image description here

Затем я добавил каталог, содержащий 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)

33
Суть в [моем ответе на вопрос Кайла Делани около полутора лет назад] (https://superuser.com/a/1196646/401839) также посвящена этому вопросу. TOOGAM 6 лет назад 1

5 ответов на вопрос

43
Ramhound

Сначала я подумал, что 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 \ Пути к приложениям

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

15
Larryc

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

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

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

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

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

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

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

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

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

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

Пожалуйста, приведите и процитируйте все источники. Если вы не написали порядок поиска по памяти, вам следовало бы сослаться на свой источник, в котором указывался список и порядок его поиска. Ramhound 6 лет назад 7
Источником будут мои заметки из того, над чем я работал пару лет назад. Я не знаю, где я взял это тогда, веб-страницы приходят и уходят. Larryc 6 лет назад 0
Вы получили их из той же [документации] (https://docs.microsoft.com/en-us/windows/desktop/shell/app-registration), от которой все остальные получили их. Ramhound 6 лет назад 5
6
Akina

Программа (когда вы указываете имя модуля без диска / пути в командной строке) в командном процессоре 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
Aaron

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

Вы специально сказали, что искали файлы с расширением 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).

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

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

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