2009-02-06 43 views
26

¿Cuál es la mejor manera de averiguar dónde notepad.exe y mspaint.exe funcionan en varias versiones de Windows?Busque la ruta de notepad.exe y mspaint.exe

¿Debo obtener el directorio de Windows a través de SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir), y luego recorrer todos los subdirectorios para buscar los dos archivos?

(se supone que no estoy interesado en nada fuera de la carpeta de Windows.)

+0

Cualquiera que sea la solución que elija, prepárese para * no * encontrarlas en absoluto. He eliminado una o ambas en algunos sistemas (¿por qué debería mantener el bloc de notas?exe cuando tengo bloc de notas ++) –

+9

@Stephen: ¿De qué sirve eliminar esas pequeñas cosas livianas que realmente no liberarán ningún recurso sino que solo introducirán el riesgo de romper algunos programas? – chiccodoro

Respuesta

0

Trate de abrir una ventana de DOS, cambie a la carpeta Windows y hacer:

dir notepad.exe /s 

largo DOS vivo :)

+0

técnicamente correcto, pero fuerza bruta y solo funciona para cosas dentro de la carpeta de Windows –

41

Esto funciona en cada caja de Windows a la que tengo acceso (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 

La gran cosa es, no lo hace tienen utilizar el actual %PATH%, puede sustituir su propio camino de búsqueda mediante el uso de una variable de entorno diferente.

+0

No sería en muchas versiones localizadas de Windows, ya que el ejecutable podría tener un nombre diferente. – peSHIr

+0

Luego, sustituye el nombre localizado. Esto será un problema con cualquier solución a menos que crea que hay una constante WIN_NOTEPAD_REALNAME en algún lugar de la API de Win32. – paxdiablo

+5

notepad.exe sigue siendo notepad.exe y cmd.exe sigue siendo cmd.exe en todas las versiones de idioma de Windows (98, XP, Vista) que he visto (alrededor de 20). Las carpetas pueden tener un nombre diferente, pero los ejecutables, las bibliotecas y otras cosas importantes no se traducen, al menos no los nombres de los archivos. – Piskvor

2

Creo que para comenzar pequeño debe obtener la variable de entorno windir y buscar en las subcarpetas %windir%\system32\ para mspaint y notepad. Lo más probable es que estén allí.

Sin embargo, si eso no funciona, entonces recurrir a una búsqueda más fuerza bruta.

2

Normalmente, simplemente las ejecutará. Están en la ruta del sistema en cada versión de Windows.

Puede usar ExpandEnvironmentStrings. La variable de entorno que desea expandir es WINDIR.

En el pasado, podría haber usado GetWindowsDirectory o GetSystemDirectory, pero creo que están en desuso.

3

Compruebe si la clave HKEY_CLASSES_ROOT \ Applications \ notepad.exe es la misma en las versiones localizadas. Tal vez el nombre de la clave sea el mismo y el valor para editar/abrir puntos para el exe localizado.
Ejemplo:

Inglés:
HKEY_CLASSES_ROOT \ Applications \ notepad.exe \ shell \ editar \ comando
% SystemRoot% \ system32 ** **% NOTEPAD.EXE 1

holandesa:
HKEY_CLASSES_ROOT \ Aplicaciones \ notepad.exe \ shell \ editar \ comando
% SystemRoot% \ system32 ** **% kladblok.exe 1

Si ése es el caso, entonces su justo punto de comprobar el registro para esa clave (igual va para el mspain t).

+0

Suena como una forma viable de hacer esto, sí. Siempre que la suposición se mantenga. (No puedo verificarlo, ya que no estoy en un Windows localizado no en inglés y no tengo permisos de edición de registro aquí ...) – peSHIr

+0

¿Alguien más que tenga la posibilidad de verificar? – Stefan

+0

al menos en la versión alemana la clave es la misma, sin embargo notepad.exe todavía se llama notepad.exe – Alex

18

Si tiene el SDK de la plataforma Microsoft instalado (the February 2003 version es la última que funciona con Microsoft VC6), se puede agarrar el programa where.exe (es 38K, sólo el 18 quilates si gzip) y ejecutar

where notepad.exe 

ayuda del comando 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 
+1

"donde" está disponible en Windows 7 de forma predeterminada y tal vez en Vista – KindDragon

0

Utilice la GetWindowsDirectory función API de Windows() para obtener la carpeta de Windows, y GetSystemDirectory() para obtener la carpeta Windows \ System. Thely está garantizado para trabajar con todas las versiones de Windows desde al menos Win95; Creo que también estaban disponibles en Win 3.x.

1

Dado que etiquetó la pregunta con WinAPI, usaría SearchPath() p. Ej. Lo siguiente poblará la variable path con el resultado.

//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); 
3

Tipo:

% windir% \ system32 \ notepad.exe en la barra de ruta thinggy

o

C: \ Windows \ System32 y encontrar notepad.exe

* C es el disco duro donde se encuentra su sistema operativo :)

-1

Vaya a la carpeta system32 y escriba "notepad.exe" en la barra 'Nombre de archivo'.

0

En resumen me parece que el mejor enfoque es comprobar el directorio Windows\System32 y las claves de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths.

En términos más generales, creo que el mejor enfoque es para imitar a ShellExecuteEx.

Tomado de:
Registro de programa (Windows)
https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

El archivo se busca en los siguientes lugares:
• El directorio de trabajo actual.
• Solo el directorio de Windows (no se buscan subdirectorios).
• El directorio Windows \ System32.
• Directorios enumerados en la variable de entorno PATH.
• Recomendado: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths

Otro posiblemente es comprobar Start Menu\Programs\Accessories, utilizando SHGetFolderPath con CSIDL_STARTMENU := 11 y CSIDL_COMMON_STARTMENU := 22, y recuperar los objetivos de los archivos LNK .

Cuestiones relacionadas