3

我使用 System.Diagnostics.Process 与已重定向 stdin/out/err 的第三方控制台应用程序进行交互(外部程序是用 C++ 编写的,我无法控制它)。

ProcessStartInfo info = new ProcessStartInfo(fileName, arg); 
info.CreateNoWindow = false; // <- if true, stdin writes don't make it through
info.UseShellExecute = false;
info.RedirectStandardInput  = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError  = true;

var proc = new Process() { StartInfo = info };
proc.OutputDataReceived += new DataReceivedEventHandler(myOutputHandler);
proc.ErrorDataReceived  += new DataReceivedEventHandler(myErrorHandler);
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();

之后...

proc.StandardInput.WriteLine("some-short-command");

当 info.CreateNoWindow = false 时,在测试控制台应用程序中工作正常;但是当 info.CreateNoWindow = true; 时没有效果

输出和错误重定向在这两种情况下都可以正常工作。

上面的代码是为 FinalBuilder 定义自定义操作的类库的一部分。可以从测试控制台应用程序或在 FinalBuilder 桌面应用程序中运行所描述的行为。

有趣的是,当从具有相同用户和环境的第三个上下文(FinalBuilder 服务器)运行时,StandardInput.WriteLine 无效,无论 info.CreateNoWindow 是真还是假。

到底是怎么回事?

无论执行上下文如何,我都可以使标准输入重定向工作吗?

4

1 回答 1

1

不知道为什么,但在这里明确指定用户可以解决问题:

proc.UserName = user;
proc.Domain= domain;
proc.Password= password;

不是很优雅,但对我有用,可能会帮助别人。

于 2013-10-14T12:02:11.217 回答