2009-05-28 2 views
3

Мне нужно сделать 2 вещи: запустить командный файл (отлично работает) и запустить команду (не работает). Метод команды выдает исключение «файл не найден». Если я открою окно cmd и набираю команду, он отлично работает.Как выполнить команды командной строки из кода

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

    } 

Прокомментированный код также вызывает то же исключение.

ответ

9

DEVCON ReScan На самом деле название исполняемого файла? Я предполагаю, что исполняемый файл DEVCON, а ReScan - это параметр. Это означает, что вы должны установить StartInfo.FileName в «DEVCON» и StartInfo.Arguments на «ReScan».

+0

У меня есть только 1 upvote, чтобы дать. Благодаря! – callisto

+0

По какой-то смешной причине это распространенная ошибка как с System.Diagnostics.Process, так и с родным ShellExecute (Ex), хотя это явно параметр «FileName» :) – OregonGhost

+0

Я бы установил filename в filename (devcon.exe) и используйте proc.StartInfo.Arguments для передачи в аргументе ReScan. Просто чтобы было ясно, что это такое. –

0

Действительно ли приложение DEVCON находится в рабочем каталоге? Иначе это не сработает, если вы не укажете полный путь к нему.

Кроме того, вы должны указать расширение, так что я полагаю, вы бы пойти на «DevCon.exe», и указать параметры не в именах, а в параметрах :)

+0

Devcon находится в каталоге PATH Environment. Работает: proc.StartInfo.FileName = "DEVCON"; proc.StartInfo.Arguments = "ReScan"; – callisto

0

Попробуйте это:

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