【发布时间】:2012-01-23 07:10:17
【问题描述】:
我想通过打开一个进程并运行 plink 从 c# 打开 SSH 连接。应该收集所有输出,并且根据结果,程序将向 ssh 触发操作。 我的大问题是,如果我使用不同的脚本,我需要(自动)用户交互。因此我必须捕获所有输出数据(标准输出、标准错误和控制台)。
看下面的测试批次应该会让案例更清楚:
1: @ECHO OFF
2: ECHO StdOut
3: ECHO StdErr 1>&2
4: ECHO Cons>CON
代码如下:
Process process;
Process process;
process = new Process();
process.StartInfo.FileName = @"cmd.exe";
process.StartInfo.Arguments = "/c test.bat";
process.StartInfo.UseShellExecute = false;
process.StartInfo.ErrorDialog = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
StreamWriter inputWriter = process.StandardInput;
[...]
我能够捕获第 2+3 行,但不能捕获第 4 行(某些程序使用)。 我也尝试过 powershell(或直接 plink)而不是 cmd.exe 作为起点,但结果相同。
c# 中是否有任何方法可以捕获控制台,或者您是否知道任何第三方命令行能够将 CON 重定向到 stdout 或类似的东西?
【问题讨论】:
-
标准输出和控制台有什么区别?
-
@DanielHilgarth 对于 Windows,我不完全确定,但在 UNIX 上,标准输出会定向到任何地方(包括文件或无处),而另一个总是会转到(文本模式)控制台。例如,这表明,如果您是远程登录的。控制台输出总是到物理控制台/计算机(我认为也有一些选项可以改变它,但一般来说)。
标签: c# shell redirect console capture