2016-06-08 4348 views
5

感谢@ user2526830获取代码。基于该代码,我在程序中添加了几行内容,因为我想读取SSH命令的输出。下面是我在while在读取C#中的控制台命令输出时,“StandardOut尚未重定向或进程尚未启动”。

行错误的代码,该行代码没有被重定向,或者进程尚未启动。

我想实现的是我想将ls的输出读入字符串。

ProcessStartInfo startinfo = new ProcessStartInfo(); 
startinfo.FileName = @"f:\plink.exe"; 
startinfo.Arguments = "-ssh [email protected] -pw abc123"; 
Process process = new Process(); 
process.StartInfo = startinfo; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardInput = true; 
process.Start(); 
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp"); 
process.StandardInput.WriteLine("exit"); 

process.StartInfo.RedirectStandardOutput = true; 

while (!process.StandardOutput.EndOfStream) 
{ 
    string line = process.StandardOutput.ReadLine(); 
} 

process.WaitForExit(); 
Console.ReadKey(); 

回答

8

尝试在启动过程之前设置标准输出重定向。

process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 
0

这可能是当您尝试读取输出(对“退出”命令的支付)时进程已经终止。尝试下面稍微修改过的版本,我在“ls”命令之后但在“退出”命令之前移动了while循环。

它应该读取你的“ls”命令的输出,但不幸的是很可能会在某个时刻挂起,因为你永远不会在StandardOutput上获得EndOfStream。当没有其他东西需要读取时,ReadLine将会阻塞,直到它可以读取另一行。

因此,除非您知道如何检测由命令生成的输出的最后一行,并在读完循环后才能跳出循环,否则可能需要使用单独的线程进行读取或写入。

ProcessStartInfo startinfo = new ProcessStartInfo(); 
startinfo.FileName = @"f:\plink.exe"; 
startinfo.Arguments = "-ssh [email protected] -pw abc123"; 
Process process = new Process(); 
process.StartInfo = startinfo; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardInput = true; 
process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp"); 

while (!process.StandardOutput.EndOfStream) 
{ 
    string line = process.StandardOutput.ReadLine(); 
} 

process.StandardInput.WriteLine("exit"); 
process.WaitForExit(); 
Console.ReadKey(); 
相关问题