2009-05-28 12 views
3

Ich muss 2 Dinge tun: eine Batch-Datei (funktioniert gut), und einen Befehl ausführen (funktioniert nicht). Die Methode für den Befehl löst die Ausnahme 'Datei nicht gefunden' aus. Wenn ich ein cmd-Fenster öffne und den Befehl eintippe, funktioniert es einwandfrei.Wie führe ich Kommandozeilenbefehle aus dem Code

private static void Rescan() 
    { 
     //System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("DEVCON ReScan"); 
     //psi.RedirectStandardOutput = true; 
     //psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     //psi.UseShellExecute = false; 
     //System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi); 
     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     proc.StartInfo.FileName = "DEVCON ReScan"; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.UseShellExecute = false; 
     proc.Start(); 
     proc.WaitForExit(); 
     System.IO.StreamReader myOutput = proc.StandardOutput; 
     proc.WaitForExit(4000); 
     if (proc.HasExited) 
     { 
      string output = myOutput.ReadToEnd(); 
      FileIO.WriteLog(_writePath, output); 
     } 

    } 

Der kommentierte Code löst auch die gleiche Ausnahme aus.

Antwort

9

DEVCON ReScan ist wirklich der Name der ausführbaren Datei? Ich denke, die ausführbare Datei ist DEVCON, während ReScan ein Parameter ist. Das bedeutet, dass Sie StartInfo.FileName auf "DEVCON" und StartInfo.Arguments auf "ReScan" einstellen müssen.

+0

Ich habe aber 1 upvote zu geben. Vielen Dank! – callisto

+0

Aus irgendeinem witzigen Grund ist das ein häufiger Fehler sowohl mit System.Diagnostics.Process als auch mit dem nativen ShellExecute (Ex), obwohl es eindeutig ein "FileName" -Parameter ist :) – OregonGhost

+0

Ich würde Dateiname auf den Dateinamen (devcon.exe) und setzen Verwenden Sie proc.StartInfo.Arguments, um das ReScan-Argument zu übergeben. Nur um klar zu sein, was was ist. –

0

Befindet sich die DEVCON-Anwendung tatsächlich im Arbeitsverzeichnis? Andernfalls wird es nicht funktionieren, wenn Sie den vollständigen Pfad angeben.

Außerdem müssen Sie die Erweiterung angeben, so dass ich nehme an, Sie für „Devcon.exe“ gehen würde, und die Parameter angeben, nicht in den Dateinamen, sondern in den Parametern :)

+0

Devcon ist in einem PATH Environment-Verzeichnis. Es funktioniert: proc.StartInfo.FileName = "DEVCON"; proc.StartInfo.Arguments = "ReScan"; – callisto

0

Versuchen Sie folgendes:

 ProcessStartInfo psi = new ProcessStartInfo();    
     psi.FileName = Environment.GetEnvironmentVariable("comspec"); 
     psi.CreateNoWindow = true; 
     psi.RedirectStandardError = true; 
     psi.RedirectStandardInput = true; 
     psi.RedirectStandardOutput = true; 
     psi.UseShellExecute = false; 

     Process p = Process.Start(psi); 

     ConsoleColor fc = Console.ForegroundColor; 

     StreamWriter sw = p.StandardInput; 
     StreamReader sr = p.StandardOutput; 

     char[] buffer = new char[1024]; 
     int l = 0; 

     sw.Write("DEVCON ReScan"); 
     sw.Write(sw.NewLine); 

     Console.Write(">> "); 

     l = sr.Read(buffer, 0, buffer.Length); 

     for (int n = 0; n < l; n++) 
      Console.Write(buffer[n] + " "); 

     p.Close(); 
Verwandte Themen