【发布时间】: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 = 在控制台中正确显示。所以,不明白哪里出了问题。
希望这能帮助你更多地理解。
谢谢
【问题讨论】: