2010-03-03 9 views
30

Korzystam z następującego kodu, aby uruchomić proces iexplore. Odbywa się to w prostej aplikacji konsolowej.Błąd w Process.Start() - system nie może znaleźć określonego pliku

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

Powyższy kod wyrzuca błąd The system cannot find the file specified. Ten sam kod po uruchomieniu bez określenia poświadczeń użytkownika działa dobrze. Nie jestem pewien, dlaczego rzuca ten błąd.

Czy ktoś może wyjaśnić?

Odpowiedz

41

Spróbuj zamienić swój kod inicjalizacji z:

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

Korzystanie non pełnego filepath na Process.Start działa tylko wtedy, gdy plik znajduje się w folderze System32.

+0

To działało.Dzięki :) –

+2

Powinniśmy podać pełną nazwę pliku, ponieważ UseShellExecute ma wartość false. –

+0

@Rashmi Pandit - tak, powinniśmy. Już wcześniej napotkałem ten sam problem :). Nie zapomnij przyjąć i przegłosuj odpowiedzi :) –

-3

Można użyć folowing aby uzyskać pełną ścieżkę do programu tak:

Environment.CurrentDirectory 
+1

To NIE daje ci ścieżki do twojego programu. To daje ci bieżący katalog, który jest czymś zupełnie innym. Bieżący katalog może być różny od początku i może się zmienić w dowolnym momencie podczas wykonywania programu. – James

10

nie można używać nazw takich jak iexplore sama, ponieważ ścieżka do programu Internet Explorer nie jest wymieniony w PATH Zmienna środowiskowa dla systemu lub użytkownika.

Jednak dowolna ścieżka wprowadzona do zmiennej środowiskowej PATH umożliwia użycie tylko nazwy pliku do jej wykonania.

System32 nie jest wyjątkowy pod tym względem, ponieważ do zmiennej PATH można dodać dowolny katalog . Każda ścieżka jest po prostu oddzielona średnikiem.

Na przykład mam c:\ffmpeg\bin\ i c:\nmap\bin\ w moim zmiennej środowiskowej PATH, więc mogę robić takie rzeczy jak new ProcessStartInfo("nmap", "-foo") lub new ProcessStartInfo("ffplay", "-bar")

Rzeczywista zmienna PATH wygląda to na moim komputerze.

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

Jak widać można użyć innych system variables, takich jak %SystemRoot% budować i konstruować ścieżki w zmiennej środowiskowej.

Po dodaniu ścieżki takiej jak "% PROGRAMFILES% \ Internet Explorer;" do zmiennej PATH będzie można używać ProcessStartInfo("iexplore");

Jeśli nie chcesz zmienić swoje PATH następnie po prostu użyć zmiennej systemowej, takie jak %PROGRAMFILES% lub %SystemRoot% a następnie rozwinąć je w razie potrzeby w kodzie. tj

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

Czy mógłbyś wyjaśnić, do czego służy @ i dlaczego jest czerwony, mimo że jest poza cytatami? –

+1

@ kingfrito_5005 Oznacza ciąg znaków jako literał łańcuchowy, dzięki czemu cokolwiek, co normalnie byłoby interpretowane jako znak escape, jest ignorowane. Aby nie było potrzeby podwójnego ukośnika odwrotnego do ścieżek - "\\ ścieżka \\ bez" vs @ "\ ścieżka \ z" – Fraser

+0

Dzięki! Fajnie jest odkrywać te przydatne nowe informacje, szukając czegoś zupełnie innego! –

0

Ponadto, jeśli ścieżka jest dir jest ujęty w cudzysłów, to będzie działać z wiersza polecenia, ale dostaniesz ten sam komunikat o błędzie

Tj to powoduje problem z procesem Process.Start(), który nie znajduje Twojego exe:

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

Może to pomaga komuś.

Powiązane problemy