3

我使用 Process 类在我的 WPF C# 应用程序中运行 pscp.exe(来自 Putty),如下所示:

Process p = new Process();
p.StartInfo.FileName = "pscp.exe";
p.StartInfo.Arguments = "-v -scp -pw xx toto@192.168.0.1:/path .";
p.Start();
p.WaitForExit();

该过程打开一个命令提示符并正确退出,就可以了。

现在,我想在进程的stderr中登录一个文件,没问题,我使用:

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;

我在我的文件中打印流,但外壳中没有显示任何内容(没关系,这是一个重定向)。

我的需要是在 shell 中显示 stderr 并将其复制到我的日志文件中(没有重定向,我想要两次)。

编辑:一个代表我需要的明确示例:想象一个 WPF 应用程序,它有一个调用此函数的按钮:

Process p = new Process();
p.StartInfo.FileName = "pscp.exe";
p.StartInfo.Arguments = "-v -scp -pw xx toto@192.168.0.1:/path .";
p.Start();
p.WaitForExit();

该过程以 cmd 提示符开始(在其中打印 stdout + stderr),同时将 stderr 打印在日志文件中。

有什么想法吗?

4

2 回答 2

0

正如 Hylaean 所述:首先,您准备 Process 对象并注册事件:

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.ErrorDataReceived += new DataReceivedEventHandler(shell_ErrorDataReceived);
p.OutputDataReceived += new DataReceivedEventHandler(shell_OutputDataReceived);

shellOut = openWriter(outputFileName);   //  opens a StreamWriter

在事件处理程序中,您可以使用 stderr 和 stdout 数据做您喜欢的事情:

// write out info to the display window
private static void shell_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string s = e.Data;

    if ((s != null) && (shellOut != null))
    {
        SomeOutOrLog(s);         //  output or log the string to somewhere
        shellOut.WriteLine(s);
    }
}

private static void shell_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    string s = e.Data;

    if (s != null) 
    {
        SomeOutOrLog(s);   //  output or log the string to somewhere
    }
}
于 2013-01-03T17:13:20.300 回答
0

您需要订阅 ErrorDataReceivedEvent

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.errordatareceived.aspx

Process p = new Process();
p.StartInfo.FileName = "pscp.exe";
p.StartInfo.Arguments = "-v -scp -pw xx toto@192.168.0.1:/path .";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.ErrorDataReceived += (o, e) => Console.Error.WriteLine(e.Data);
p.Start();
p.WaitForExit();
于 2012-12-07T11:45:34.670 回答