Управляйте выводом, полученным от команды RUN, и действуйте соответственно - C # - PullRequest
0 голосов
/ 03 февраля 2011

Полагаю, вы все неправильно поняли мой вопрос и закрыли его на Как запустить Команду в C # и извлечь из нее данные?

Я также сказал в этом посте: - хочуЗапустите команду из командной строки и хотите получить ее вывод и отобразить ее вывод.При необходимости хотите закрыть процесс и отобразить ошибку или соответствующее сообщение.Чтобы остановить процесс, я должен нажать клавишу «F4» в командной строке. Пока процесс не будет остановлен или остановлен, он должен быть только живым.

Я создал класс для обработки запущенного cmd. ИЯ продолжаю получать выходные данные. Но при чтении каждой выходной строки я хочу остановить или выбросить исключение, если обнаружил что-либо неправильное в выходных данных.

Я пытаюсь подключиться к серверу через cmd. Сервер продолжает выдавать выходные данные.Предположим, что сервер выдал вывод как: Попытка запуска ..... Cananot загрузить файл ..... Выход

При получении вывода я хочу проверить наличие строк типа "Не удается найти файл", "ПодключеноУспешно и т. Д. И установите свойства ccordingly (например, connected = true, errorMsg = "Не удается найти файл". Когда я вызываю класс, я могу позаботиться об этих свойствах и остановить, если найден подключенный == true или errorMsg.length> 0.С этим сообщите пользователю, что «Соединение установлено, или сообщение об ошибке, сообщающее о« Не удается загрузить файл »», и отключите сервер, если errorMsg найден.

Я нигде не обнаружил никаких манипуляций с полученным выводом, и вот тут я застрял.Я нашел много в интернете.Я застрял и пытаюсь выяснить эту часть за последние 3-4 дня.Тогда разместите здесь.

Мне нужна помощь в этом.Пожалуйста, помогите мне.Если потребуется, я приведу фрагменты кода psot.Но, пожалуйста, помогите мне.И не закрывайте эту ветку, так как ответили без полного понимания моего вопроса.Это не дубликат.

Мой код класса:

    public int ConnectToServer()
    {
        int error = 0;
        connected = false;
        try
        {
            process = Process.Start(processInfo);

            process.BeginOutputReadLine();
            process.OutputDataReceived += new DataReceivedEventHandler(Process_OutputDataReceived);
            //if (errorMsg.Length > 0)
            //    throw new Exception(errorMsg);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error Processing ConnectToServer : " + e.Message);
            connected = false;
            errorMsg = e.Message;
            error = -1;
            return error;
        }

        return error;
    }

    private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        errorMsg = "";
        connected = false;
        string d = e.Data;

        if (!string.IsNullOrEmpty(d))
        {
            if (sb != null)
                sb.Append(d + "\n");
            Console.WriteLine("LINE = " + d);
            if (d.IndexOf("Initialization Completed") > 0)
            {
                connected = true;
                Console.WriteLine("********* Connected = " + connected);
            }
            else if (isInValidLine(d))
            {
                //throw new Exception(d);
                connected = false;
                errorMsg = d;
                return;
            }
                            }
        return;
    }

    private bool isInValidLine(string line)
    {
        if (line.IndexOf("Cannot load file") > 0)
        {
            errorMsg = line;
            return true;
        }
        return false;
    }   

ВЫШЕ КОД КЛАССА ПРАВИЛЬНО С МОИМИ ТРЕБОВАНИЯМИ?В имплементации:

        while (!oc.Connected)
        {
            timepassed = (int)(DateTime.Now - start).TotalMilliseconds;
            if (timepassed > timeout)
            {
                oc.DisconnectServer();
                connectedToVpn = false;
                throw new Exception("NotConnectedException");
            } else if (oc.ErrorMessage.Length > 0)
            {
                oc.DisconnectServer();
                connectedToVpn = false;
                throw new Exception(oc.ErrorMessage);
            }
            Thread.Sleep(100);
        }   

Вот что я делаю, когда я получаю строку вывода, я проверяю, является ли она подключенной или недействительной.Если он недействителен, я устанавливаю строку как errorMsg.В моем цикле while я продолжаю проверять наличие Connected и errorMessage, но значение errorMessage остается только "".Он никогда не обновляется, что говорит мне, что обработка выходного кода никогда не выполняется.Ни в режиме отладки я не нахожу курсор в этой строке, но строка = отображается в консоли, как правило, правильно.Итак, не понимаю, что происходит и где.

Надеюсь, это поможет вам лучше понять.

Спасибо

1 Ответ

0 голосов
/ 03 февраля 2011

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

чтобы прочитать вывод, вы перенаправили стандартный вывод, для отправки ввода вы также должны перенаправить стандартный ввод процесса.

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