當 Windows 能夠找到 Mercurial 執行檔的完整路徑時,如何找到它?
澄清:問題真的是:如何找到 Mercurial 命令行客戶端。如果答案適用於任何執行檔,那就更好了,但我對
hg.exe執行檔真的很感興趣。如果我知道執行檔的名稱,比如
hg.exeMercurial 命令行客戶端,並且 Windows 知道它在哪裡,因為我可以hg log從命令提示符處執行它並執行,為了讓我自己找到該執行檔,涉及哪些步驟,以與命令提示符和 Windows 相同的方式嗎?基本上,如果 Windows 能夠找到它,我希望我的程序能夠找到它。
是否有 WinAPI 函式或類似函式?程式碼將在 .NET 中執行,用 C# 編寫,因此如果 .NET 中為此內置了任何內容,那將是首選解決方案,否則我不反對為此使用 P/Invoke。
我已經看到了這個問題的一個潛在重複:c# Check if an executable exists in the windows path,但這就是它的全部嗎?只是遍歷
PATH環境變數的內容並在每個目錄中查找執行檔?我有一個模糊的概念,這只是所涉及的步驟之一,並且可能存在我應該知道的 Windows 可以使用的系統資料庫覆蓋,因此我將在此處發布問題。
另一方面,如果這裡真的只有 PATH 變數,它可能可以安全地作為副本關閉。
這取決於程序如何在系統中註冊。由於 hg 通常是從工具或命令行執行的,因此它不會在系統中註冊。如果是,則有一組具有 exe 名稱和路徑的系統資料庫項。否則,您只需將路徑從第一個條目迭代到最後一個條目,直到找到所需的文件。在路徑上找到的第一個獲勝。
此類“註冊”程序、excel 或 winword 的範例。
編輯:
@BillyONEal 在下面提出了一個很好的觀點,它只適用於“執行”命令程序,但我的觀點是還有第二個地方可以看。
此外,對於那些還沒有看到這個的人,這裡是安裝過程:
對某些人來說效果更好的替代方案是在 PATH 上搜尋 hg
你可以作弊並使用
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; }