2010-11-09 12 views
11

Para aclarar: La pregunta es realmente: Cómo localizo el cliente de línea de comandos de Mercurial. Si la respuesta es aplicable a cualquier ejecutable, mucho mejor, pero estoy realmente interesado en el archivo ejecutable hg.exe.¿Cómo encontrar la ruta completa al ejecutable de Mercurial, cuando Windows puede ubicarlo?

Si conozco el nombre de un archivo ejecutable, digamos hg.exe, el cliente de línea de comandos de Mercurial, y Windows sabe dónde está porque puedo ejecutar hg log desde un símbolo del sistema y se ejecuta, ¿qué pasos están involucrados para mí? encontrar el ejecutable yo mismo, de la misma manera que el símbolo del sistema y Windows lo hace?

Básicamente, si Windows puede ubicarlo, quiero que mi programa pueda localizarlo.

¿Hay una función WinAPI, o similar? El código se ejecutará en .NET, escrito en C#, por lo que si hay algo incorporado en .NET para esto sería la solución preferida, pero de lo contrario no me resultará contrario al uso de P/Invoke para esto.

He visto un posible duplicado de esta pregunta: c# Check if an executable exists in the windows path, pero ¿es eso todo lo que hay que hacer? Simplemente itere sobre el contenido de la variable de entorno PATH y busque en cada uno de esos directorios el ejecutable.

Tengo una vaga noción de que ése es solo uno de los pasos involucrados, y posiblemente que hay anulaciones de registro que Windows puede usar y que debería conocer, así que publicaré la pregunta aquí.

Si, por otro lado, realmente solo existe la variable PATH en juego aquí, probablemente se cierre con seguridad como un duplicado.

Respuesta

3

Depende de cómo el programa está registrado en el sistema. Como hg generalmente se ejecuta desde cualquiera de las herramientas o la línea de comando, no se registrará con el sistema. Si fuera, hay un conjunto de claves de registro que tiene el nombre y la ruta del ejecutor. De lo contrario, solo sigue el camino desde la primera entrada hasta la última hasta que encuentre el archivo que necesita. El primero encontrado en el camino gana.

Ejemplos de un programa "registrado", excel o winword.

EDIT:

@BillyONeal hace un buen punto por debajo, que sólo funciona para los programas de comando "Ejecutar", pero mi punto es que había un segundo lugar para buscar.

Además, para aquellos que no han visto esto, aquí está la install procedures:

Un esquema alternativo que funciona mejor para algunos es la búsqueda de Hg en la ruta de carga

+0

Ok, entonces eso es lo que haré. El código no está escrito en piedra de todos modos, así que si descubro más tarde, siempre puedo cambiarlo. El método PATH funciona muy bien ahora en las máquinas en las que lo probé, así que me quedaré con eso por el momento. Gracias. –

+1

No del todo. "Registro" (o más bien, la clave de registro App Paths) solo se usa al iniciar un proceso con ShellExecute (como se hace mediante "Ejecutar ..."), pero no mediante CreateProcess (como lo hizo el procesador de comandos) –

+0

@BillyOneal bien punto, pero estaba a punto de publicar la URL del grupo de hg sobre cómo se articula en% PATH% de todos modos. – jcolebrand

2

ejecutables de acuerdo a la primera instancia coincidente en la ruta del sistema. Si se ejecuta desde un acceso directo u otro modo que utiliza una ruta absoluta, sin embargo, esa es la versión que se ejecuta.

Las DLL son un poco más complicadas: para las DLL nativas, hay sustituciones, ¿quizás eso es lo que estás pensando? Ver here.

+0

no, él está trabajando con hg (mercurial) para DLL no funciona – jcolebrand

+0

@drachenstern - solo trato de hablar sobre la vaga noción de la que hablamos en la pregunta. –

+0

~ lo suficientemente cierto. Y para dlls no trataría de mirar el camino de todos modos, ¿eso funcionaría? ruta del sistema SÍ, buscando manualmente en% path% tho? – jcolebrand

5

puede engañar y utilizar el comando where.exe

public GetFullPath(string program) 
{ 
    string result; 

    Process myProcess = new Process() 
    { 
     UseShellExecute = false, 
     RedirectStandardOutput = true, 
     StartInfo = new ProcessStartInfo(@"%SYSTEMDIR%\where.exe") 
    }; 

    using (StreamReader sr = myProcess.StandardOutput) 
    { 
     myProcess.Start(); 
     result = myStreamReader.ReadLine(); 
     myProcess.Close(); 
    } 

    return result; 
} 
+0

dijo específicamente que estaba tratando de evitar el comando where – jcolebrand

+1

@drachenstern en el chat SO, pero no en la pregunta en sí. –

+0

: p ~ yah yah yah – jcolebrand

1

Windows proporciona la función SearchPath. Si pasa NULL como el parámetro lpPath, utiliza la ruta de búsqueda del sistema. En su caso, usted debe llamar a:

SearchPath(NULL, "hg", NULL, ...) 

La declaración de C# es:

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
internal static extern int SearchPath(string path, string fileName, string extension, int numBufferChars, StringBuilder buffer, int[] filePart); 
Cuestiones relacionadas