【问题标题】:Why does RedirectStandardInput has no effect when ProcessStartInfo.CreateNoWindow is set to true?为什么当 ProcessStartInfo.CreateNoWindow 设置为 true 时 RedirectStandardInput 没有效果?
【发布时间】:2013-07-21 23:11:09
【问题描述】:

我使用 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 是真还是假。

发生了什么事?

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

【问题讨论】:

  • 控制台模式应用程序有两种方式写入控制台。他们可以像 *nix 程序那样写入标准输出。或者他们可以使用本机控制台 api 编写。添加风味,例如响应单个按键和添加颜色。第一个会重定向,第二个不会。你中了不幸的平局。
  • 感谢您的洞察力。是否有任何解决方法可以使用本机控制台 api 将输入发送到此类控制台应用程序?
  • 如果本机控制台 api 应用程序不会重定向,我会感到困惑,因为我的确实会重定向,但并非在所有情况下......我一定在这里遗漏了一些东西。
  • 你刷新标准输入流了吗? process.StandardInput.BaseStream.Flush();

标签: c# .net io console finalbuilder


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2011-10-03
    • 2014-05-10
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多