2010-03-03 280 views
30

我正在使用以下代碼來激發iexplore進程。這是在一個簡單的控制檯程序中完成的。Process.Start()中的錯誤 - 系統找不到指定的文件

public static void StartIExplorer() 
{ 
    var info = new ProcessStartInfo("iexplore"); 
    info.UseShellExecute = false; 
    info.RedirectStandardInput = true; 
    info.RedirectStandardOutput = true; 
    info.RedirectStandardError = true; 

    string password = "password"; 
    SecureString securePassword = new SecureString(); 

    for (int i = 0; i < password.Length; i++) 
     securePassword.AppendChar(Convert.ToChar(password[i])); 

    info.UserName = "userName"; 
    info.Password = securePassword; 
    info.Domain = "domain"; 

    try 
    { 
     Process.Start(info); 
    } 
    catch (System.ComponentModel.Win32Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

上述代碼拋出錯誤The system cannot find the file specified。運行時沒有指定用戶憑據的相同代碼工作正常。我不知道爲什麼它會拋出這個錯誤。

有人能解釋一下嗎?

回答

41

嘗試用替換您的初始化代碼:

ProcessStartInfo info 
    = new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe"); 

使用非完整文件路徑,如果該文件是在System32文件夾中發現Process.Start纔有效。

+0

這工作。謝謝:) – 2010-03-03 06:25:04

+2

我們應該指定完整的文件名,因爲UseShellExecute設置爲false。 – 2010-03-03 06:25:41

+0

@Rashmi潘迪特 - 是的,我們應該。我之前已經遇到過同樣的問題:)。不要忘記接受和贊成答案:) – 2010-03-03 06:43:17

-3

可以使用如下因素來獲取完整路徑的程序是這樣的:

Environment.CurrentDirectory 
+1

這不會爲您提供程序的路徑。這給你當前的目錄,這是完全不同的東西。當前目錄可以不同於啓動,並且它可以在程序執行期間隨時更改。 – James 2017-07-26 19:56:30

10

您不能自行使用像iexplore一個文件名,因爲到Internet Explorer的路徑是不是在上市PATH系統或用戶的環境變量。

但是,任何進入PATH環境變量的路徑都允許您僅使用文件名來執行它。

System32在這方面不是特別的任何目錄都可以加到PATH變量中。每條路徑都簡單地用分號分隔。

比如我在PATH環境變量c:\ffmpeg\bin\c:\nmap\bin\,所以我可以做的事情一樣new ProcessStartInfo("nmap", "-foo")new ProcessStartInfo("ffplay", "-bar")

實際PATH變量看起來像這樣我的機器上。

%SystemRoot%\system32;C:\FFPlay\bin;C:\nmap\bin; 

正如你可以看到你可以使用其他system variables,如%SystemRoot%建設和構建環境變量路徑。

所以 - 如果你添加一個路徑如「%PROGRAMFILES%\ Internet Explorer;」您PATH變量,你將能夠使用ProcessStartInfo("iexplore");

如果你不想改變你的PATH然後只需使用一個系統變量,如%PROGRAMFILES%%SystemRoot%,然後在需要的代碼時展開。即

string path = Environment.ExpandEnvironmentVariables(
     @"%PROGRAMFILES%\Internet Explorer\iexplore.exe"); 
var info = new ProcessStartInfo(path); 
+1

你能解釋一下@是什麼,爲什麼它是紅色的,即使它在報價之外? – 2017-08-29 19:00:50

+1

@ kingfrito_5005它將字符串標記爲字符串文字,以便任何通常被解釋爲轉義字符的內容都被忽略。因此,您不需要雙向反斜槓路徑 - 「\\ path \\ without」vs @「\ path \ with」 – Fraser 2017-08-29 21:14:44

+0

謝謝!它非常有趣地發現這些有用的新信息,同時尋找完全不同的東西! – 2017-08-30 13:38:04

0

另外,如果您的PATH的目錄是用引號括起來,它會在命令提示符下工作,但你會得到同樣的錯誤信息

即這會導致與Process.Start()沒有找到您的exe問題:

PATH="C:\my program\bin";c:\windows\system32 

也許它可以幫助某人。

相關問題