2010-11-09 33 views
11

Để làm rõ: Câu hỏi thực sự là: Làm thế nào để xác định vị trí máy khách dòng lệnh Mercurial. Nếu câu trả lời có thể áp dụng cho bất kỳ tệp thực thi nào, thì càng tốt, nhưng tôi thực sự quan tâm đến tệp thực thi hg.exe.Làm thế nào để tìm đường dẫn đầy đủ đến Mercurial thực thi, khi Windows có thể định vị nó?

Nếu tôi biết tên của tệp thực thi, hãy nói hg.exe, ứng dụng dòng lệnh Mercurial và Windows biết vị trí của nó là vì tôi có thể thực hiện hg log từ dấu nhắc lệnh và thực thi, các bước nào liên quan đến tôi để thấy rằng thực thi bản thân mình, trong cùng một cách mà dấu nhắc lệnh và Windows hiện nó?

Về cơ bản, nếu Windows có thể định vị nó, tôi muốn chương trình của tôi có thể định vị nó.

Có chức năng WinAPI hay tương tự không? Mã sẽ chạy trong .NET, được viết bằng C#, vì vậy nếu có bất kỳ thứ gì được tích hợp vào .NET thì đây sẽ là giải pháp được ưu tiên, nhưng nếu không tôi không có hại khi sử dụng P/Invoke cho việc này.

Tôi đã nhìn thấy một tiềm năng trùng lặp của câu hỏi này: c# Check if an executable exists in the windows path, nhưng đó là tất cả có phải không? Chỉ cần lặp qua nội dung của biến môi trường PATH và tìm trong mỗi thư mục đó để thực thi?

Tôi có một khái niệm mơ hồ rằng đó chỉ là một trong các bước liên quan và có thể có ghi đè sổ đăng ký mà Windows có thể sử dụng mà tôi cần biết, vì vậy tôi sẽ đăng câu hỏi ở đây.

Nếu, mặt khác, có thực sự chỉ là biến PATH trong chơi ở đây, nó có thể có thể đóng một cách an toàn như là một bản sao.

Trả lời

3

Tùy thuộc vào cách chương trình được đăng ký với hệ thống. Vì hg thường chạy từ một trong hai công cụ hoặc dòng lệnh, nó sẽ không được đăng ký với hệ thống. Nếu có một tập hợp các khóa registry có tên và đường dẫn exe. Nếu không, bạn chỉ cần lặp lại đường dẫn từ mục nhập đầu tiên cho đến khi bạn tìm thấy tệp bạn cần. Đầu tiên được tìm thấy trên đường dẫn sẽ thắng.

Ví dụ về chương trình "đăng ký", excel hoặc winword như vậy.

EDIT:

@BillyONeal làm cho một điểm tốt dưới đây, mà chỉ hoạt động cho "chạy" chương trình lệnh, nhưng quan điểm của tôi là đã có một vị trí thứ hai để xem xét.

Bên cạnh đó, đối với những người chưa từng thấy này, đây là install procedures:

Một kế hoạch thay thế mà hoạt động tốt hơn đối với một số là để tìm kiếm hg trên PATH

+0

Ok, thì đó là những gì tôi sẽ làm. Mã không được đặt trong đá anyway, vì vậy nếu tôi tìm hiểu thêm sau này, tôi luôn có thể thay đổi nó. Phương pháp PATH hoạt động tốt ngay bây giờ trên các máy tôi đã thử nghiệm trên, vì vậy tôi sẽ chỉ gắn bó với điều đó trong thời gian này. Cảm ơn. –

+1

Không hoàn toàn. "Đăng ký" (hoặc đúng hơn, khóa đăng ký Đường dẫn ứng dụng) chỉ được sử dụng khi bắt đầu quá trình với ShellExecute (được thực hiện bằng "Chạy ..."), nhưng không phải bởi CreateProcess (được thực hiện bởi bộ xử lý lệnh) –

+0

@BillyOneal good nhưng tôi sắp đăng URL từ nhóm hg về cách nó được bản lề trên% PATH% anyways. – jcolebrand

2

Executables tải theo cho ví dụ phù hợp đầu tiên trong đường dẫn hệ thống. Nếu được thực hiện từ một phím tắt hoặc chế độ khác sử dụng đường dẫn tuyệt đối, tất nhiên đó là phiên bản chạy.

Các tệp DLL phức tạp hơn một chút - đối với các tệp DLL gốc có ghi đè, có lẽ đó là những gì bạn đang nghĩ đến? Xem here.

+0

không, anh ấy làm việc với hg (mercurial) để DLL không làm việc. – jcolebrand

+0

@drachenstern - chỉ cố gắng nói với ý niệm mơ hồ có thể được nói đến trong câu hỏi. –

+0

~ đủ chính xác. Và cho dlls tôi sẽ không cố gắng nhìn vào con đường anyways, mà thậm chí sẽ làm việc? đường dẫn hệ thống YES, tìm kiếm theo cách thủ công trên% path% tho? – jcolebrand

5

bạn có thể gian lận và sử dụng where.exe lệnh

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

ông đặc biệt nói rằng ông đã cố gắng để tránh lệnh nơi – jcolebrand

+1

@drachenstern trong SO trò chuyện, nhưng không phải trong câu hỏi riêng của mình. –

+0

: p ~ yah yah yah – jcolebrand

1

Windows cung cấp các chức năng SearchPath. Nếu bạn vượt qua NULL làm thông số lpPath, nó sẽ sử dụng đường dẫn tìm kiếm hệ thống. Trong trường hợp của bạn, bạn nên gọi: khai

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

C# là:

[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); 
Các vấn đề liên quan