操作从命令RUN接收的输出并相应地采取行动 - C#

时间:2011-02-03 09:13:16

标签: c# process

我想你们都误解了我的问题并在How to run a Command in C# and retrieve data from it?

关闭了

我在那篇文章中也曾说过: -  想要从命令promt运行一个命令,并希望它的输出和操作它的输出。如果需要,请关闭进程并显示错误或相应的消息。要停止这个过程,我必须在命令提示符下按“F4”键。直到进程被停止或被杀死,它必须只是活着。

我已经创建了一个类来处理运行cmd。而且我一直在获得输出。但是在读取输出的每一行时我想停止或抛出异常,如果在输出中发现任何不正确的东西。

我想通过cmd连接到服务器。服务器继续提供输出。假设服务器输出为: 试着开始...... Cananot加载文件 ..... 离开

在检索输出时,我想检查“无法找到文件”,“已连接成功等”等行,并按照设置属性(如connected = true,errorMsg =“找不到文件”。我在哪里调用类,我可以照顾那些proeprties并停止,如果发现连接== 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进行chekcing,但errorMessage的值仅保留为“”。它永远不会更新,这告诉我从不执行处理输出代码。在调试模式下我也没有找到该行的光标,但是在控制台中显示了Line =。所以,不明白出了什么问题,在哪里。

希望这有助于您更好地理解。

由于

1 个答案:

答案 0 :(得分:0)

一旦你重定向了你执行过程的标准输出,就可以解析你收到的内容,我相信也是一行一行,然后你可以发布命令来控制你的过程。

读取您已重定向标准输出的输出,要发送输入,您还应该重定向该过程的标准输入。