【问题标题】:Manipulate the output receiving from command RUN and act accordingly - C#操作从命令 RUN 接收的输出并采取相应措施 - C#
【发布时间】:2011-02-03 09:13:16
【问题描述】:

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

我在那篇文章中也说过:- 想要从命令提示符运行命令并想要它的输出并处理它的输出。如果需要,要关闭进程并显示错误或适当的消息。要停止该进程,我必须在命令提示符下按“F4”键。直到进程停止或终止,它必须是活着的。

我创建了一个类来处理运行 cmd。我不断得到输出。但是在读取输出的每一行时,如果在输出中发现任何不正确的地方,我想停止或抛出异常。

我想通过 cmd 连接到服务器。服务器继续提供输出。假设服务器给出的输出为: 试图开始...... Canano 加载文件 ...... 退出

在检索输出时,我想检查诸如“找不到文件”、“连接成功等”之类的行并相应地设置属性(如已连接 = true、errorMsg =“找不到文件”。我在哪里调用类,如果发现已连接 == true 或 errorMsg.length > 0,我可以处理这些属性并停止。通过此通知用户“连接已实现或错误消息说明有关“无法加载文件”并在发现 errorMsg 时断开服务器.

我没有发现任何地方对输出接收进行任何操作,这就是我发现自己卡住的地方。我在网上找到了很多。我被困住并试图从过去 3-4 天找出这部分。然后在这里发帖。

我需要这方面的帮助。请帮我。如果需要,我将 psot 代码 sn-ps。但请帮助我。并且不要在没有完全理解我的问题的情况下关闭这个帖子。这不是重复的。

我的代码是类:

    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 的值仅保持为“”。它永远不会更新,这告诉我处理输出代码永远不会执行。在调试模式下,我也没有在该行找到光标,但 Line = 在控制台中正确显示。所以,不明白哪里出了问题。

希望这能帮助你更多地理解。

谢谢

【问题讨论】:

    标签: c# process


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多