2015-01-28 6 views
0

Мне нужно написать небольшую утилиту для восстановления решения. Я использую код ниже, чтобы сделать то же самое.Показать команды cmd на C# winform Приложение

 string solutionFile = @"E:\Projects\TFS\Code\WebSite.sln"; 
     string cmd1 = @"""C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86" + " &devenv " + "\"" + solutionFile + "\"" + " /rebuild release"; 
     cmd1 = "\"" + cmd1 + "\""; 
     String command = String.Format("{0} {1}", @"/k ", cmd1); 
     ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe") 
     { 
      UseShellExecute = false, 
      RedirectStandardOutput = true 
     }; 

     cmdsi.Arguments = command; 
     using (Process cmd = Process.Start(cmdsi)) 
     { 
      using (StreamReader reader = cmd.StandardOutput) 
      { 
       string result = reader.ReadToEnd(); 
       listBox1.Items.Add(result); 
      } 
     } 

Если вы увидите в командной строке, вы можете увидеть результат выполнения, но то же самое не отражается в списке.

Пожалуйста, помогите решить эту проблему.

Заранее спасибо.

+0

Помню, я делал это раньше, но я дон Не помню, чтобы когда-либо сталкивались с такой проблемой. Тем не менее, вы пробовали вызывать «listBox1.Items.Add» в основном потоке? Это может быть проблема, связанная с потоком. – Falgantil

+0

Из-за основного потока он не будет показывать результат сразу, но после завершения выполнения он должен показать вывод. Но он показывает только одно пространство («»). Я позаботился об этом [link] (http://www.dotnetperls.com/redirectstandardoutput) – Vikesh

+0

Попробуйте упростить 'cmd1', поэтому он просто запускает базовый пакетный файл, который перекликается с текстом на консоль и видит, работает ли это , Это должно сузить проблему до кода, который вы показали, или командного файла, который вы вызываете. –

ответ

0

Вы можете перенаправить вывод во временный файл, а затем может прочитать файл, как-

string cmd1 = "help > e:/temp.txt"; //e:/temp.txt is temporary file where the output is redirected. 
     String command = String.Format("{0} {1}", @"/k ", cmd1); 

     ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe") 
     { 
      //You don't need to read console outputstream 
      //UseShellExecute = false, 
      //RedirectStandardOutput = true 
     }; 

     cmdsi.Arguments = command; 
     using (Process cmd = Process.Start(cmdsi)) 
     { 
      //Check if file exist or you can wait till the solution builds completely. you can apply your logic to wait here. 
      if (File.Exists("E:/temp.txt")) 
      { 
       //Read the files here 
       string[] lines = File.ReadAllLines("E:/temp.txt"); 
       //Do your work here 
      } 
     } 
0

Вы можете сделать это ASync:

string solutionFile = @"E:\Projects\TFS\Code\WebSite.sln"; 
string batFile = @"C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"; 
string args = "x86" + " &devenv " + "\"" + solutionFile + "\"" + " /rebuild release"; 

ProcessStartInfo cmdsi = new ProcessStartInfo(batFile) 
{ 
       Arguments = args, 
       UseShellExecute = false, 
       RedirectStandardOutput = true 
}; 

using (Process cmd = new Process()) 
{ 
      cmd.StartInfo = cmdsi; 
      cmd.OutputDataReceived += (sender, args) => listBox1.Items.Add(string.IsNullOrEmpty(args.Data) ? string.Empty : args.Data); 
      cmd.Start(); 
} 
+0

, если файл bat не запустится, запустите его по процессу cmd, как вы это сделали. – mdghost

 Смежные вопросы

  • Нет связанных вопросов^_^