2012-04-15 125 views
0

通過使用下面的代碼[C#],我們可以知道googlechrome的安裝路徑。但是,這段代碼首先啓動chrome.exe,然後進入它的路徑。我的問題是沒有啓動chrome.exe,我怎麼知道路徑?C#windows服務位置

 ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.FileName = "chrome.exe"; 
     string argmnt = @"-g"; 
     startInfo.Arguments = argmnt; 

     String path = null; 
     try 
     { 
      Process p = Process.Start(startInfo); 
      path = p.MainModule.FileName; 
      p.Kill(); 
     } 
     catch (Exception e) 
     { 
      return String.Empty; 
     } 
+0

您是否曾經解決過這個問題? – harpo 2012-04-20 15:23:39

回答

0

解析PATH環境變量並枚舉查找該exe文件的所有目錄。這實際上是OS在您調用p.Start方法時執行的操作。

+0

那是什麼?我應該在Windows註冊表中搜索?或者別的地方?你能澄清嗎? – user743246 2012-04-16 01:32:52

0

首先從Microsoft下載一個名爲「Process Monitor」的工具:ProcessMonitor available from Microsoft SysInternals然後啓動Chrome以查找其位置。

提示:「進程監控器」實時監控硬盤驅動器,註冊表和線程/進程信息,並允許您保存它捕獲的跟蹤信息。

enter image description here

一個。打開Process Monitor,它將開始跟蹤信息。

b。單擊放大鏡工具欄按鈕(其開/關跟蹤按鈕)停止跟蹤。

c。然後單擊清除跟蹤按鈕清除跟蹤。 d)。啓動Chrome,一旦其打開,搜索Chrome.exe,它會告訴你文件路徑。

0

使用WHERE命令和chrome.exe作爲參數。這將告訴你將被shell加載的可執行文件的路徑。

你只需要回讀命令的輸出。

這與您當前的版本一樣,假定可執行文件位於系統PATH中。

下面是一些代碼,您可以根據自己的需要進行調整。它基本上包裝了WHERE命令(順便說一句是一個可執行文件,所以WHERE WHERE將顯示其路徑)。

using System; 
using System.Diagnostics; 

public sealed class WhereWrapper 
{ 
    private static string _exePath = null; 

    public static int Main(string[] args) { 

     int exitCode; 
     string exeToFind = args.Length > 0 ? args[0] : "WHERE"; 

     Process whereCommand = new Process(); 

     whereCommand.OutputDataReceived += Where_OutputDataReceived; 

     whereCommand.StartInfo.FileName = "WHERE"; 
     whereCommand.StartInfo.Arguments = exeToFind; 
     whereCommand.StartInfo.UseShellExecute = false; 
     whereCommand.StartInfo.CreateNoWindow = true; 
     whereCommand.StartInfo.RedirectStandardOutput = true; 
     whereCommand.StartInfo.RedirectStandardError = true; 

     try { 
      whereCommand.Start(); 
      whereCommand.BeginOutputReadLine(); 
      whereCommand.BeginErrorReadLine(); 
      whereCommand.WaitForExit(); 
      exitCode = whereCommand.ExitCode; 

     } catch (Exception ex) { 
      exitCode = 1; 
      Console.WriteLine(ex.Message); 

     } finally { 
      whereCommand.Close(); 
     } 

     Console.WriteLine("The path to {0} is {1}", exeToFind, _exePath ?? "{not found}"); 

     return exitCode; 
    } 

    private static void Where_OutputDataReceived(object sender, DataReceivedEventArgs args) { 

     if (args.Data != null) { 
      _exePath = args.Data; 
     } 
    } 
}