2015-12-27 3 views
0

Я хочу вызвать cmd.exe с помощью C#. И я хочу написать несколько команд cmd в C#.Как взаимодействовать с cmd.exe с помощью C#?

Наиболее важные ключи таковы: Я хочу взаимодействовать с cmd window.the следующая команда вводится в соответствии с последним выходом команды.

Но теперь я попытался, он может вводить несколько команд, но только один выход или один выходErr.

Я хочу, чтобы одна команда имела один выход, а следующая команда также является тем же самым окном cmd, а не новым окном cmd?

Как решить эту проблему. пример кода, как этот

string[] message = new string[2]; 

ProcessStartInfo info = new ProcessStartInfo(); 

info.RedirectStandardInput = true; 
info.RedirectStandardOutput = true; 
info.RedirectStandardError = true; 

info.UseShellExecute = false; 
info.FileName = "cmd.exe"; 
info.CreateNoWindow = true; 

Process proc = new Process(); 
proc.StartInfo = info; 
proc.Start(); 

using (StreamWriter writer = proc.StandardInput) 
{ 
    if (writer.BaseStream.CanWrite) 
    { 
     foreach (string q in command) 
     { 
      writer.WriteLine(q); 
     } 
     writer.WriteLine("exit"); 
    } 
} 

message[0] = proc.StandardError.ReadToEnd(); 

if (output) 
{ 
    message[1] = proc.StandardOutput.ReadToEnd(); 
} 

return message; 
+0

ли вызов 'proc.StandardOutput.ReadToEnd();' не даст вам все выходные? Ваша проблема в том, что вы не знаете, как разделить ее? –

+0

'proc.StandardOutput.ReadToEnd()' может выводить весь вывод команды, но проблема может быть в том, что следующая команда будет набираться в соответствии с предыдущим выходом команды. Например, если предыдущий вывод команды «Сколько лет вы «Я буду вводить число, если вывод команды pre« What's s your name », я буду вводить мое имя ... – user5720776

+0

Должен признаться, этот вопрос меня смущает. Я не понимаю, что _Я хочу взаимодействовать с cmd window.the следующая команда набирается в соответствии с последней командой output._ действительно означает. Кроме того, это приложение Windows, и вы также хотите окно консоли? Почему бы не использовать 'AllocConsole'. См. Это [ответ] (например, http://stackoverflow.com/questions/9943040/how-to-write-to-a-console-window-from-a-windows-application). –

ответ

1

Проблема в том, что CMD является приложением кли, так proc.StandardOutput.ReadToEnd() будет блокировать ваш поток, вы не можете просто положить ReadToEnd() в цикле (для выполнения нескольких команд).

В моей демонстрации я запускаю новый поток для обработки вывода. Так что я не буду блокировать ввод команды.

var proc = new Process 
     { 
      StartInfo = new ProcessStartInfo 
      { 
       FileName = "cmd.exe", 
       UseShellExecute = false, 
       RedirectStandardOutput = true, 
       RedirectStandardInput = true, 
       CreateNoWindow = true 
      } 
     }; 
     proc.Start(); 
     StringBuilder sb = new StringBuilder(); 
     var outStream = proc.StandardOutput; 
     var inStream = proc.StandardInput; 
     inStream.WriteLine("mkdir test"); 
     Task.Run(() => 
     { 
      while (true) 
      { 
       Console.WriteLine(outStream.ReadLine()); 
      } 
     }); 
     Console.WriteLine("dir"); 
     inStream.WriteLine("dir"); 

     Console.WriteLine("mkdir test"); 
     inStream.WriteLine("mkdir test"); 

     Console.WriteLine("dir"); 
     inStream.WriteLine("dir"); 
     Console.ReadLine(); 

    } 

простите мой бедный английский,

+0

Пингвин, к какому роду вы принадлежите? империя? –