gpt4 book ai didi

c# - 创建一个 cmd 窗口并从 C# 应用程序写入它

转载 作者:太空狗 更新时间:2023-10-30 00:48:50 27 4
gpt4 key购买 nike

我正在为 Grasshopper for Rhino 开发一个 C# 组件。当我运行一些相当繁重的迭代分析时,我想将结果连续输出到 cmd 窗口,以确保分析确实在运行。

这是我尝试过的:

using System.Diagnostics;


Result results = new Result();
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = false;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

do {
results = RunHeavyOperation(results);
cmd.StandardInput.WriteLine("echo " + results.usefulInfo);
} while (!results.conditionForEnd);

cmd.WaitForExit();

Result RunHeavyOperation(Result previousResults) {
Result res = doHeavyStuff(previousResults);
return res;
}

我意识到我缺少了一部分,但它是什么?

最佳答案

您的方法是错误的:您目前没有写入控制台窗口。相反,您通过启动 cmd.exe 并写入到该进程的标准输入管道 来创建一个进程。 cmd.exe 不知道这一点。这与通过键盘在控制台中键入不同,甚至会产生奇怪的效果。
假设您输出一个换行符,那么 cmd.exe 可能会尝试“执行”您之前作为命令输出的内容。

正确的方法是调用AllocConsole .通过此调用,您可以为您的进程创建一个控制台窗口,并通过 Console.WriteLine() 简单地使用它。

当您完成工作和记录后,您最终需要通过 FreeConsole 关闭并再次释放此控制台。 .

所以导入这两个native方法:

internal sealed class NativeMethods
{
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();

[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
}

并在您的代码中使用它们:

NativeMethods.AllocConsole();

// start work
Console.WriteLine("log messages...");

// finished work

NativeMethods.FreeConsole();

请注意,FreeConsole()关闭 控制台窗口,因此您的所有日志消息都会丢失。控制台只有这么大的缓冲区,如果离开缓冲区,您将无法回滚到较早的消息。

因此,将您的日志消息简单地写入一个您可以稍后分析的文件中可能是一个更好的主意。

关于c# - 创建一个 cmd 窗口并从 C# 应用程序写入它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42979805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com