2010-03-03 5 views
30

J'utilise le code suivant pour déclencher le processus iexplore. Ceci est fait dans une application de console simple.Erreur dans Process.Start() - Le système ne trouve pas le fichier spécifié

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

Le code ci-dessus est de lancer l'erreur The system cannot find the file specified. Le même code lorsqu'il est exécuté sans spécifier les informations d'identification de l'utilisateur fonctionne correctement. Je ne suis pas sûr pourquoi il lance cette erreur.

Quelqu'un peut-il expliquer?

Répondre

41

Essayez de remplacer votre code d'initialisation avec:

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

En utilisant filepath non complet sur Process.Start ne fonctionne que si le fichier se trouve dans le dossier System32.

+0

Cela a fonctionné.Merci :) –

+2

Nous devrions spécifier le nom de fichier complet car UseShellExecute est défini sur false. –

+0

@Rashmi Pandit - oui nous devrions. J'ai déjà rencontré le même problème avant :). N'oubliez pas d'accepter et d'augmenter la réponse :) –

-3

Vous pouvez utiliser le folowing pour obtenir le chemin complet à votre programme comme celui-ci:

Environment.CurrentDirectory 
+1

Cela ne vous donne PAS le chemin de votre programme. Cela vous donne le répertoire actuel, qui est quelque chose de complètement différent. Le répertoire courant peut être différent pour commencer, et il peut changer à tout moment pendant l'exécution du programme. – James

10

Vous ne pouvez pas utiliser un nom de fichier comme iexplore par lui-même, car le chemin d'accès Internet Explorer ne figure pas dans la PATH variable d'environnement pour le système ou l'utilisateur. Cependant, tout chemin saisi dans la variable d'environnement PATH vous permet d'utiliser uniquement le nom de fichier pour l'exécuter.

System32 n'est pas particulière à cet égard comme un répertoire peut être ajouté à la variable PATH. Chaque chemin est simplement délimité par un point-virgule.

Par exemple, j'ai c:\ffmpeg\bin\ et c:\nmap\bin\ dans ma variable d'environnement de chemin, donc je peux faire des choses comme new ProcessStartInfo("nmap", "-foo") ou new ProcessStartInfo("ffplay", "-bar")

La variable PATH réelle ressemble à ceci sur ma machine.

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

Comme vous pouvez le voir, vous pouvez utiliser d'autres system variables, comme %SystemRoot% pour construire et construire des chemins dans la variable d'environnement. Donc, si vous ajoutez un chemin comme "% PROGRAMFILES% \ Internet Explorer;" à votre variable PATH vous serez en mesure d'utiliser ProcessStartInfo("iexplore");

Si vous ne voulez pas modifier votre PATH alors utilisez simplement une variable de système tel que %PROGRAMFILES% ou %SystemRoot% puis développez en cas de besoin dans le code. à savoir

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

Pourriez-vous expliquer à quoi sert le @, et pourquoi il est rouge même si c'est en dehors des citations? –

+1

@ kingfrito_5005 Il marque la chaîne comme une chaîne littérale de sorte que tout ce qui serait normalement interprété comme un caractère d'échappement est ignoré. Alors que vous n'avez pas besoin de double-backslash les chemins - "\\ chemin \\ sans" vs @ "\ path \ avec" – Fraser

+0

Merci! C'est tellement amusant de découvrir ces nouvelles informations utiles en cherchant quelque chose de totalement différent! –

0

Aussi, si votre PATH dir est entre guillemets, il fonctionnera à partir de l'invite de commande, mais vous obtiendrez le même message d'erreur

à savoir cela provoque un problème avec Process.Start() ne pas trouver votre exe:

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

Peut-être que cela aide quelqu'un.

Questions connexes