我使用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服务器)中运行时,无论info.CreateNoWindow是true还是false,StandardInput.WriteLine均无效。

到底是怎么回事?

无论执行上下文如何,都可以使stdin重定向工作吗?

最佳答案

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

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


不太优雅,但对我有用,可能会对某人有所帮助。

关于c# - 当ProcessStartInfo.CreateNoWindow设置为true时,为什么RedirectStandardInput不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17777891/

10-10 19:39