Найдите путь к файлам notepad.exe и mspaint.exe. - PullRequest
26 голосов
/ 06 февраля 2009

Какой лучший способ узнать, где находятся notepad.exe и mspaint.exe, которые будут работать в разных версиях Windows?

Должен ли я получить каталог Windows через SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir), а затем пройти через все подкаталоги, чтобы найти два файла?

(Предположим, что я не заинтересован в чем-либо, кроме папки Windows.)

Ответы [ 11 ]

41 голосов
/ 06 февраля 2009

Это работает на каждом компьютере с Windows, к которому у меня есть доступ (XP +).

c:\> for %i in (cmd.exe) do @echo %~$PATH:i
C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo %~$PATH:i
C:\Python25\python.exe

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

18 голосов
/ 06 февраля 2009

Если у вас установлен Microsoft Platform SDK ( февральская версия - последняя, ​​которая работает с Microsoft VC6), вы можете получить программу where.exe (это 38 КБ, только 18 КБ, если вы взяли gzip это) и запустить

where notepad.exe

справка из команды where:

WHERE [/R dir] [/Q] [/F] [/T] pattern...

Description:
    Displays the location of files that match the search pattern.
    By default, the search is done along the current directory and
    in the paths specified by the PATH environment variable.

Parameter List:
    /R       Recursively searches and displays the files that match the
             given pattern starting from the specified directory.

    /Q       Returns only the exit code, without displaying the list
             of matched files. (quite mode)

    /F       Displays the matched filename in double quotes.

    /T       Displays the file size, last modified date and time for all
             matched files.

    pattern  Specifies the search pattern for the files to match.
             Wildcards * and ? can be used in the pattern. The
             "$env:pattern" and "path:pattern" formats can also be
             specified, where "env" is an environment variable and
             the search is done in the specified paths of the "env"
             environment variable. These formats should not be used
             with /R. The search is also done by appending the
             extensions of the PATHEXT variable to the pattern.

     /?      Displays this help message.

  NOTE: The tool returns an error level of 0 if the search is
        successful, of 1 if the search is unsuccessful and
        of 2 for failures or errors.

Examples:
    WHERE /?
    WHERE myfilename1 myfile????.*
    WHERE $windir:*.*
    WHERE /R c:\windows *.exe *.dll *.bat
    WHERE /Q ??.???
    WHERE "c:\windows;c:\windows\system32:*.dll"
    WHERE /F /T *.dll
3 голосов
/ 05 марта 2012

Тип:

% WINDIR% \ system32 \ notepad.exe в баре пути штуковина

или

C: \ Windows \ System32 и найдите notepad.exe

* C - это жесткий диск, на котором находится ваша ОС:)

3 голосов
/ 06 февраля 2009

Проверьте, совпадает ли ключ HKEY_CLASSES_ROOT \ Applications \ notepad.exe в локализованных версиях. Возможно, имя ключа такое же, и значение для редактирования / открытия указывает на локализованный исполняемый файл.
Пример:

английский
HKEY_CLASSES_ROOT \ Applications \ notepad.exe \ оболочки \ редактировать \ команду
% SystemRoot% \ system32 ** NOTEPAD.EXE **% 1

Голландский:
HKEY_CLASSES_ROOT \ Applications \ notepad.exe \ оболочки \ редактировать \ команду
% SystemRoot% \ system32 ** kladblok.exe **% 1

Если это так, то он собирается проверить реестр для этого ключа (то же самое касается mspaint).

2 голосов
/ 06 февраля 2009

Обычно вы просто выполняете их. Они находятся на системном пути в каждой версии Windows.

Вы можете использовать ExpandEnvironmentStrings. Переменная среды, которую вы хотите раскрыть: WINDIR.

В прошлом вы могли использовать GetWindowsDirectory или GetSystemDirectory, но я думаю, что они устарели.

2 голосов
/ 06 февраля 2009

Я думаю, что для начала нужно получить переменную окружения windir и посмотреть в подпапках %windir%\system32\ для mspaint и notepad. Скорее всего, они будут там.

Однако, если это не помогает, тогда прибегайте к более грубому поиску.

1 голос
/ 08 февраля 2009

Поскольку вы пометили вопрос с помощью WinAPI, я бы использовал SearchPath () , например. следующее заполнит переменную path результатом.

//Get the full path to notepad
char path[MAX_PATH] = { 0 };
LPSTR* ptr = NULL;
DWORD dwRet = SearchPath(NULL, "notepad.exe", NULL, MAX_PATH, (LPSTR)path, ptr);
0 голосов
/ 05 февраля 2017

Короче я считаю, что лучший подход это проверить Windows\System32 каталог и HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths ключи реестра.

В целом я считаю, что лучший подход должен имитировать ShellExecuteEx.

Взято из:
Регистрация приложения (Windows)
https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

Файл ищется в следующих местах:
• Текущий рабочий каталог.
• Только каталог Windows (подкаталоги не ищутся).
• Каталог Windows \ System32.
• Каталоги, перечисленные в переменной среды PATH.
• Рекомендуется: HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Пути к приложениям

Еще, возможно, стоит проверить Start Menu\Programs\Accessories, используя SHGetFolderPath с CSIDL_STARTMENU := 11 и CSIDL_COMMON_STARTMENU := 22, и получить цели из файлов lnk.

0 голосов
/ 13 августа 2014

Перейдите в папку system32 и введите «notepad.exe» в строке «Имя файла».

0 голосов
/ 06 февраля 2009

Используйте функцию WinAPI GetWindowsDirectory (), чтобы получить папку Windows, и GetSystemDirectory (), чтобы получить папку Windows \ System. Они гарантированно работают со всеми версиями Windows, начиная как минимум с Win95; Я думаю, что они были доступны и в Win 3.x.

...