Перенаправление ввода / вывода cmd.exe - PullRequest
3 голосов
/ 07 ноября 2010

У меня возникли проблемы с использованием перенаправленного ввода / вывода процесса.Первоначально у меня было два приложения, взаимодействующих через TCP / IP.Сервер сообщает клиенту открыть cmd.exe, а затем дает клиенту команды о том, что клиент должен перенаправить процесс cmd.exe.Затем клиент читает выходные данные и отправляет их обратно на сервер.По сути, я создавал способ удаленного использования командной строки.

Проблема в том, что она работает для первой команды, а затем ничего для последующего.Я смог воссоздать проблему без использования tcp / ip.

Process p = new Process();
ProcessStartInfo psI = new ProcessStartInfo("cmd");
psI.UseShellExecute = false;
psI.RedirectStandardInput = true;
psI.RedirectStandardOutput = true;
psI.CreateNoWindow = true;
p.StartInfo = psI;
p.Start();
p.StandardInput.AutoFlush = true;
p.StandardInput.WriteLine("dir");
char[] buffer = new char[10000];
int read = 0;
// Wait for process to write to output stream
Thread.Sleep(500);
while (p.StandardOutput.Peek() > 0)
{
    read += p.StandardOutput.Read(buffer, read, 10000);
}
Console.WriteLine(new string(buffer).Remove(read));

Console.WriteLine("--- Second Output ---");
p.StandardInput.WriteLine("dir");
buffer = new char[10000];
read = 0;
Thread.Sleep(500);
while (p.StandardOutput.Peek() > 0)
{
    read += p.StandardOutput.Read(buffer, read, 10000);
}
Console.WriteLine(new string(buffer).Remove(read));
Console.ReadLine();

Это явно уродливый тестовый код, но я получаю те же результаты.Я могу прочитать вывод в первый раз, а затем он приходит пустым во второй раз.Я предполагаю, что когда я использую выходной поток в первый раз, я блокирую его и запрещаю cmd.exe снова использовать этот поток?Если это так, как правильно использовать выходной поток несколько раз после каждой входной команды.Я хотел бы сделать это синхронно, чтобы сохранить ощущение командной строки.Если единственным решением является асинхронное чтение выходного потока, есть ли способ, которым я мог бы в общих чертах выяснить, когда процесс завершил выполнение моего ввода?Я не хочу, чтобы сервер говорил клиенту выполнить другую команду до ее завершения.

Спасибо.

1 Ответ

6 голосов
/ 08 ноября 2010

Должен ли это быть один и тот же сеанс cmd для всех команд?как насчет:

    private static void RunCommand(string command)
    {
        var process = new Process()
                          {
                              StartInfo = new ProcessStartInfo("cmd")
                               {
                               UseShellExecute = false,
                               RedirectStandardInput = true,
                               RedirectStandardOutput = true,
                               CreateNoWindow = true,
                               Arguments = String.Format("/c \"{0}\"", command),
                               }
                          };
        process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
        process.Start();
        process.BeginOutputReadLine();

        process.WaitForExit();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...