Чи шукає командний рядок 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

у командному рядку.

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

Потім я додав до PATH каталог, що містить audacity.exe:

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

після чого я знову спробував запустити зухвалість:

start audacity

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

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

Я пробував і інші програми. Chrome і Firefox працюють під час використання команди start.

ОНОВЛЕННЯ: Я використовую 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, функція шукає файл. Рекомендуємо зареєструвати свою заявку в підрозділі реєстру App Paths. Це дозволяє уникнути необхідності додатків змінювати системну змінну середовища PATH.

  • Поточний робочий каталог.
  • Лише каталог Windows (підкаталоги не шукаються).
  • Каталог Windows \ System32.
  • Каталоги, перелічені в змінній середовища PATH.
  • Рекомендовано: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Шлях до програми

Джерело: Реєстрація додатків


15

З командного рядка, якщо ви просто введете, WinWordвоно не запускається.

Якщо ви введете, START WinWordце працює.

Тут Startключова команда.

Коли ви намагаєтеся виконати файл за допомогою команди start, командна строка не виконує жодного пошуку. Натомість він передає ім'я файлу (та аргументи) самій Windows (через виклик API ShellExecuteEx), який потім повинен шукати місцезнаходження файлу. Є кілька місць, які він шукає у такому порядку:

  • Поточний робочий каталог.

  • Лише Windowsкаталог (не шукаються підкаталоги).

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

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

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

WinWordзнаходиться в цьому ключі реєстру. Ключ є, щоб не PATHзатягувати занадто довго.


7
Будь ласка, цитуйте та цитуйте всі джерела. Якщо ви не написали порядок пошуку з пам’яті, ви мали б вказати своє джерело, яке вказувало перелік та порядок пошуку.
Рамхаунд

Джерелом були б мої записки з чогось, над чим я працював пару років тому. Я не знаю, де я його тоді взяв, веб-сторінки приходять і йдуть.
Ларрік

5
Ви їх отримали з тієї самої документації, від якої вони отримали всі інші.
Рамхаунд

7

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

  • за допомогою змінної середовища PATH (як виконується, так і його тверда посилання / програмне забезпечення / ярлик з тим самим іменем)

  • автор псевдонім 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... замість цього вона має a standalone.bat.

Деякі з розширень, на які PATHEXTя зараз дивлюся, я ніколи не використовував додатки. Ті , які я вже зіткнулися з набагато більш часто (але , очевидно , не так , скільки exe) , є: .com, .bat, .vbs, .js, .jar. Перші два - це файли пакетних скриптів Windows, а інші три - типи файлів для конкретних мов програмування, які запускаються зі скриптів або віртуальних машин замість exes (відповідно: visual basic, javascript та java).


Небайдужі виборці хочуть коментувати (я знаю, що це зазвичай марно запитувати, але іноді я отримую відповідь)? Чи я десь помилився?
Loduwijk

Не я, але, як не дивно, це тому, що хоча PATHEXTі PATH, і те , і інше пов'язане з тим, щоб працювати, вони дещо ортогональні у своїх завданнях. PATHвизначає, де шукати речі для запуску, і те, про що запитувала ОП, при цьому PATHEXTвизначає, що можна виконати.
dgnuff

@dgnuff Цікаво, оскільки це було моєю суттю: OP спеціально сформулював це питання таким чином, щоб попросити виклик кадрів ... в термінах SE, вони задавали "питання XY", зробивши припущення, що файл, який запускається, не є у місцях, які вже шукали на стежці. У будь-якому випадку, дякую.
Loduwijk

0

start winwordне повідомляє командний рядок для запуску winword. Він повідомляє командний рядок для запуску startз аргументом winword. Startвикористовує власні методи пошуку winword.

Просто winwordповідомляє командний рядок запустити winword. І якщо ви спробуєте це, оскільки winwordвін не на PATH, він не запускається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.