Попробуйте в окне «Выполнить» (Win+R) ввести wmplayer и нажать Enter — откроется Windows Media Player. Теперь сделайте то же самое в командной строке. Проигрыватель не запустится, потому что не найден путь к нему! Почему так происходит?
Читатель блога Андрей поинтересовался по почте, в каких случаях для запуска исполняемых файлов не требуется вводить полный путь к ним. Вопрос показался мне элементарным, и я кратко предложил читателю обратить внимание на переменную PATH.
[+] На этой странице
Переменная PATH
Переменная среды PATH содержит пути, в которых Windows при выполнении команды автоматически ищет исполняемые файлы (EXE, CMD, VBS и т.д.). Изначально в переменную внесены только основные системные расположения, поэтому программы из папок Windows и System32 можно запускать, не указывая полный путь.
Как посмотреть содержимое переменной PATH
Некоторые программы при установке прописывают туда путь к своей папке, в чем вы наверняка убедитесь, выполнив в консоли команду path, показывающей системные и пользовательские переменные вместе.
Когда исполняемый файл находится в одном из расположений, известных Windows, вводить полный путь к файлу необязательно. Я использую это свойство операционной системы, чтобы быстро запускать любимые инструменты Sysinternals, утилиты Nirsoft и другие программы из своего сундучка (на рисунке видно, что в PATH добавлена папка Tools).
Как добавить свои пути к переменной PATH
Вы можете добавить собственные пути, изменив системную или пользовательскую переменную PATH. Разницу между типами переменных я объяснял в рамках одной из викторин. Там же рассказывается, как изменять переменные среды в графическом интерфейсе. Обратите внимание, что пути разделяются точкой с запятой.
При поиске исполняемого файла система сначала смотрит в системной переменной PATH, затем в пользовательской. В пределах каждой переменной приоритет определяется по порядку в строке, т.е. преобладает первый путь. Общий порядок показывает команда path.
Можно быстро добавить свои пути в PATH из командной строки с помощью утилиты setx, входящей в состав Windows 7+. Ниже приводится пример добавления пути C:\myfolder в системную переменную PATH (командная строка должна быть запущена от имени администратора).
For /f "tokens=2*" %a In ('Reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') Do Set "systempath=%b" set newpath=%systempath%;C:\myfolder1 setx /m path "%newpath%"
Сначала с помощью команды reg считывается список путей из системной переменной PATH, хранящейся в реестре. Затем команда set задает переменную newpath с нужным путем в рамках текущей сессии командной строки, а команда setx /m делает новый путь постоянным для системной переменной (параметр /m).
Пользовательскую переменную можно задать без прав администратора, применив аналогичный подход. Добавление нового пути к имеющейся пользовательской переменной PATH осуществляется так:
For /f "tokens=2*" %a In ('Reg query "HKCU\Environment" /v Path') Do Set "userpath=%b" set newpath=%userpath%;C:\myfolder2 setx path "%newpath%"
Учтите, что код выше рассчитан на выполнение в командной строке. В командном файле (CMD) символы процента в первой строке должны быть двойными.
Строго говоря, здесь можно было обойтись и без setx, поскольку reg может не только считывать данные из реестра, но и записывать их туда. Но во многих случаях с setx проще работать за счет более компактного синтаксиса.
Конечно, я не расписывал все это так подробно для Андрея, а просто задал ему направление. Однако на следующий день он написал мне, что все это знал (я — посредственный телепат :) и задал вопрос, которым я начал сегодняшний рассказ. Это было уже интереснее, и я пообещал раскрыть тему в блоге!
Раздел реестра App Paths
Действительно, не указывая полный путь, можно запустить некоторые стандартные программы Windows из окна «Выполнить», но не из командной строки. Помимо проигрывателя Windows Media, это, например, Paint (mspaint) и Wordpad (wordpad). То же самое верно и для приложений MS Office – проверьте команду excel или winword!
Разница между окном «Выполнить» и командной строкой заключается в том, что оболочка Windows (explorer) обладает более широкими возможностями, чем консольный интерпретатор команд. В данном случае все дело в функции ShellExecuteEx, которой снабжена оболочка. Когда вы запускаете исполняемый файл без указания полного пути к нему, функция выполняет поиск в:
- текущей папке
- папках Windows и System32
- разделе реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
Как работает раздел App Paths
Давайте посмотрим на работу App Paths на примере Windows Media Player.
Здесь:
- создан подраздел с псевдонимом исполняемого файла (в данном случае – это wmplayer.exe)
- в параметре По умолчанию указан полный путь к файлу. Если в пути к файлу используется переменная, параметр должен быть расширяемым строковым (REG_EXPAND_SZ). Указывая абсолютный путь, можно обойтись обычным строковым параметром (REG_SZ).
- в параметре Path задана рабочая папка программы
Работает это очень просто. Вы вводите псевдоним файла в окне «Выполнить» или адресной строке проводника, а система автоматически смотрит в указанном пути.
Как ускорить свою работу с помощью App Paths
Этим разделом реестра можно пользоваться для быстрого запуска программ, ярлыки которых не нужны вам в панели задач или на рабочем столе. Например, для поиска и замены в текстовых файлах я применяю программу BKReplacem (replacem.exe), у которой своя папка внутри папки PortableSoft. В разделе App Paths я создал подраздел bkr.exe и указал полный путь к утилите. Теперь ее запуск сводится к выполнению bkr в окне «Выполнить».
Кстати, не забывайте заключать в кавычки пути, содержащие пробелы. И, надеюсь, вы уже догадались, что можно сократить команду до одной буквы. Продолжая этот пример, я мог бы создать подраздел b.exe. Вообще, у программы может быть сколько угодно псевдонимов, как вы увидите чуть ниже.
Еще одно применение, которое я нашел для App Paths, это запуск cmd.exe с полными правами. Я давно обхожусь без запроса UAC, благодаря запуску командной строки из планировщика заданий. Создав подраздел cmda.exe, я указал в нем путь к командному файлу, выполняющему задание.
В нем всего одна строка:
schtasks /run /tn CMD_Admin
Теперь достаточно ввести в окно «Выполнить» команду cmda, чтобы открыть командную строку от имени администратора.
Что интересного можно найти в разделе App Paths
Во-первых, я уверен, что вы найдете там многие из установленных у вас программ. Вместо того чтобы прописывать путь к своей папке в переменную PATH, программы регистрируют свой исполняемый файл в разделе App Paths, следуя рекомендациям Microsoft.
Во-вторых, там есть подразделы WORDPAD.EXE и WRITE.EXE, причем оба ведут к файлу wordpad.exe.
Программа Write, входившая в состав первых операционных систем Microsoft, в Windows 95 была заменена на WordPad. Вы также найдете подраздел pbrush.exe, ссылающийся на mspaint, лежащий в System32.
Программ Write и Paintbrush нет в Windows уже лет 15, однако упоминание о них до сих пор содержится в системе! И это подводит нас к разговору о том, когда и зачем в Windows ввели раздел App Paths.
История App Paths
Раздел App Paths появился в Windows 95 в качестве противоядия от засорения пути PATH, который задавался в файле autoexec.bat. Программы традиционно добавляли туда пути к своим папкам, как это до сих пор иногда делается с одноименной переменной среды. При загрузке системы файл считывался, а программы оказывались в системном пути.
Кстати, старый способ autoexec.bat до сих пор работает, позволяя запускать исполняемые файлы без указания пути, хотя использовать его уже нет смысла.
Основная проблема для разработчиков состояла в том, что найти в autoexec.bat правильную строку SET PATH было нетривиальной задачей. При этом нельзя было вставлять свою строку в начало файла, поскольку другая команда ниже могла переопределить переменную.
Кроме того, добавлять путь в PATH ради того чтобы указать Windows на одну единственную программу, было не рационально, сродни стрельбе из пушки по воробьям. Вот тогда разработчики Windows 95 и придумали решение с разделом реестра, позволяющим указывать пути к конкретным исполняемым файлам.
Почему в этом разделе до сих пор есть подразделы для Write и Paintbrush? Так Windows обеспечивает совместимость программ!
Теоретически, какая-нибудь древняя программа может полагаться на своих ровесниц, наследницы которых уже сменили имя или расположение. Чтобы старые приложения не ломались, используется раздел реестра App Paths.
Псевдонимы магазинных приложений
В Windows 10 1709 у магазинных приложений появились псевдонимы выполнения. Разработчик приложения прописывает в манифесте псевдоним, что позволяет запускать по нему приложение из командной строки и оболочки Windows. В примере ниже фрагмент манифеста утилиты Monitorian, о которой я рассказывал.
<uap3:Extension Category="windows.appExecutionAlias" Executable="MonitorianPlus\MonitorianPlus.exe" EntryPoint="Windows.FullTrustApplication"> <uap3:AppExecutionAlias> <desktop:ExecutionAlias Alias="Monitorian.exe" /> </uap3:AppExecutionAlias> </uap3:Extension>
Пользовательское изменение псевдонимов не предусмотрено, их можно только отключить в параметрах — ищите там alias или псевдоним. Об этой возможности полезно знать, потому что бывают неприятные сюрпризы, как с Python.
Бонус: исследователь из Google Project Zero разбирает подноготную работы псевдонимов в контексте безопасности: Overview of Windows Execution Aliases.
Сводная таблица
Итак, подведем итог! Проще всего сравнить возможности оболочки Windows и командного интерпретатора системы в табличной форме.
Поиск исполняемого файла | Проводник | Командная строка |
---|---|---|
Текущая папка | Да | Да |
Системные папки (Windows, System32) | Да | Нет |
Переменная PATH | Да | Да |
Раздел реестра App Paths | Да | Нет 1 |
Псевдонимы магазинных приложений | Да | Да |
В таком виде становится наглядным не только более широкий диапазон поиска исполняемых файлов в проводнике, но и не вполне очевидная зависимость командной строки от переменной PATH. Именно ее пути влияют на то, нужно ли в консоли указывать путь к файлам, расположенным в системных папках.
Наконец, раздел App Paths представляет дополнительную ценность за счет того, что в нем можно указывать короткие псевдонимы исполняемых файлов, упрощая их запуск.
А вы используете раздел реестра App Paths или собственные переменные среды? Если да, то расскажите в комментариях, как они упрощают вашу работу!
Но можно использовать команду start:
start wordpad
↩
Просто ХР чаще стоит на NTFS. FAT32 моветон, ни разу не видел. В любом случае рекомендуется использовать NTFS.
Так что по мне вполне возможно. Правда возможно в 2001 году реалии были другими, но никто не мешал внедрить обязательность NTFS для установки ХР в SP3.
Лучше бы поддержку больших файлов и объёмов больше 32 ГБ. А то физически в мой телефон можно воткнуть все 64, но из- за ограничений ФС приходится довольствоваться 32, и мирится с невозможностью залить файлы больше 4 ГБ.
во времена пояdления WinXP компьютеры были не такими быстрыми, а NTFS откушивала довольно немаленький кусок ресурсов (и процессорных, и памяти, и шины с винтом) Соответсвенно навязывать NTFS всем было минимум глупо. А те кто понимал разницу и кому она была нужна, чаще всего не нуждались в помощи.
> Действительно, не указывая полный путь, можно запустить некоторые стандартные программы Windows из окна «Выполнить», но не из командной строки. Помимо проигрывателя Windows Media, это, например, Paint (mspaint) и Wordpad (wordpad).
А вот и не правда: mspaint открывает paint и из «выполнить» и из командной строки, потому что находится в C:\windows\system32\, а этот путь по умолчанию перечислен в path. А вот wordpad уже открывается только так, как у вас написано, потому что он лежит в другой папке, которая не перечислена в path.
Зачет!
Вадим, а можно ли сделать так, чтобы windows выдавала нужные мне программы, файлы, которые находятся не на системном диске при использовании поиска в меню Пуск?
http://puu.sh/buR0l/feca29715f.png
Евгений, можно.
Из CMD.EXE можно запускать программы с учётом App Path, если воспользоваться командой START:
Согласен. Добавил примечание в таблицу, спасибо :) Я все-таки фокусировался на родных способностях, а с командами пределов уже нет. Но тут интересно, что start туда смотрит.