Windows中的stdin重定向控制台应用程序问题

时间:2014-10-14 07:29:48

标签: .net windows sftp stdin io-redirection

我正在开发一个项目,将SFTP应用程序包装到实用程序库中,以便在内部公司项目中使用。我们公司使用Tectia,但我们也在寻找像WinSCP这样的其他库。我知道还有其他开源SFTP客户端,但我的公司坚持支持Tectia。我知道Tectia支持使用-B开关的批处理文件,但我们希望库的使用者能够使用SFTP而无需学习语法并只使用.NET方法,所以我决定使用包装运行sftpg3的交互式控制台。如果我将凭据作为命令行参数包含,我可以启动该过程,甚至可以成功登录。问题是我无法使用重定向的StandardInput与流程进行交互。代码如下:

Process sftpproc = new Process();
sftpproc.StartInfo.FileName = @"sftpg3";
sftpproc.StartInfo.UseShellExecute = false;
sftpproc.StartInfo.RedirectStandardInput = true;
sftpproc.StartInfo.RedirectStandardOutput = true;
sftpproc.StartInfo.RedirectStandardError = true;
sftpproc.StartInfo.CreateNoWindow = true;

StringBuilder sb = new StringBuilder();

sftpproc.OutputDataReceived += 
    (sender, args) => { sb.AppendFormat("INFO:{0}\n", args.Data); };
sftpproc.ErrorDataReceived += 
    (sender, args) => { sb.AppendFormat("WARN:{0}\n", args.Data); };
sftpproc.Start();
sftpproc.BeginOutputReadLine();
sftpproc.BeginErrorReadLine();

StreamWriter input = sftpproc.StandardInput;

input.WriteLine("open USER@SERVER");
input.WriteLine("lcd D:\\");
input.WriteLine("get file.txt");

string messages = sb.ToString();

上面的代码与WinSCP命令行完美配合,或者直接在控制台中使用控制台命令。我尝试将sftpg3的输出重定向到文本文件,并且能够重定向它,然后我尝试重定向输入控制台重定向(sftpg3 <cmd.txt)并且无法执行命令(但是, -B有效,但如上所述,这不是我所需要的)。有没有办法强制控制台应用程序从重定向的stdin读取?从cmd.exe调用该应用程序并不适合我。

1 个答案:

答案 0 :(得分:1)

如果sftpg3 < cmd.txt不起作用,则应用程序不会从标准输入读取。

无论你在哪里重定向。你根本无法采取这种方法。