Как найти полный путь к исполняемому файлу Mercurial, когда Windows сможет его найти?

Чтобы уточнить: Вопрос действительно: Как найти клиент командной строки Mercurial. Если ответ применим к любому исполняемому файлу, тем лучше, но меня действительно интересует исполняемый файл hg.exe.

Если я знаю имя исполняемого файла, скажем hg.exe, клиент командной строки Mercurial, и Windows знает, где он, потому что я могу выполнить только hg log из командной строки, и он выполняет, какие шаги участвуют в заказать для меня сам этот исполняемый файл так же, как это делает командная строка и Windows?

В принципе, если Windows сможет найти его, я хочу, чтобы моя программа могла его найти.

Есть ли функция WinAPI или аналогичная? Код будет работать в .NET, написанном на С#, поэтому, если что-то встроенное в .NET для этого было бы предпочтительным решением, но в остальном я не против использования P/Invoke для этого.

Я видел один потенциальный дубликат этого вопроса: С# Проверить, существует ли исполняемый файл в пути к окну, но это все, что ему нужно? Просто перебирайте содержимое переменной среды PATH и просматриваете в каждом из этих каталогов исполняемый файл?

У меня есть неопределенное представление о том, что это только один из шагов, и возможно, что есть переопределения реестра, которые Windows может использовать, о которых я должен знать, поэтому я отправлю вопрос здесь.

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

Ответ 1

Это зависит от того, как программа зарегистрирована в системе. Поскольку hg обычно запускается либо из инструментов, либо из командной строки, он не будет зарегистрирован в системе. Если это был набор ключей реестра, который имеет имя и путь exe. В противном случае вы просто идите по пути от первой записи до последней, пока не найдете нужный вам файл. Первый найденный на пути побеждает.

Примеры такой "зарегистрированной" программы, excel или winword.

EDIT:

@BillyONeal делает хороший пример ниже, который работает только для "запуска" командных программ, но, на мой взгляд, было второе место для просмотра.

Кроме того, для тех, кто этого не видел, здесь установить процедуры:

Альтернативная схема, которая лучше работает для некоторых, - это поиск hg на PATH

Ответ 2

вы можете обмануть и использовать команду 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;
}

Ответ 3

Загрузка исполняемых файлов в соответствии с первым совпадающим экземпляром в системном пути. Если выполняется из ярлыка или другого режима, который использует абсолютный путь, конечно, что версия, которая работает, хотя.

DLL немного сложнее - для встроенных DLL есть переопределения, возможно, о чем вы думаете? См. здесь.

Ответ 4

Windows предоставляет функцию SearchPath. Если вы передаете NULL в качестве параметра lpPath, он использует путь поиска системы. В вашем случае вы должны позвонить:

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

Объявление С#:

[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);