gpt4 book ai didi

c# - 用 C# 编写的 cmd.exe 样式应用程序

转载 作者:行者123 更新时间:2023-11-30 22:44:23 25 4
gpt4 key购买 nike

我试图从任何基于 DOS 的应用程序中获取结果,有效地让 C# 像用户一样操作它。

我可以让它执行命令,然后显示输出。问题是知道输出何时结束!例如,如果我开始/运行“cmd.exe”,键入“D:”,然后是“cd D:\”,然后是“tree”,它会在 D 驱动器上输出我的文件夹结构,然后允许我键入我的下一个命令(仅之后它完成打印列表)。

但是我无法在代码中找到一种方法来让它意识到它已经完成,并且应该允许下一个命令(基本上当 cmd.exe 开始闪烁光标时)。

        public Process p = null;

private void Form1_Load(object sender, System.EventArgs e)
{
ProcessStartInfo procStarter = new ProcessStartInfo("cmd.exe");
procStarter.RedirectStandardOutput = true;
procStarter.RedirectStandardInput = true;
procStarter.UseShellExecute = false;
procStarter.CreateNoWindow = true;
p = Process.Start(procStarter);
}

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
p.Close();
}

private void btnSend_Click(object sender, System.EventArgs e)
{
p.StandardInput.WriteLine("D:");
p.StandardInput.WriteLine(@"cd D:\");
txtOutput.Text = SendCommand(txtInput.Text);
}

private string SendCommand(string cmd)
{
p.StandardInput.WriteLine(cmd);
return p.StandardOutput.ReadToEnd();
}

在 SendCommand(string cmd) 中,如果我按照上面的代码运行 p.StandardOutput.ReadToEnd(),它会永远挂起,大概是在等待应用程序关闭?

如果我循环遍历 p.StandardOutput.ReadLine(),它会显示所有文本(包括“D:\>”,就在闪烁光标所在的位置之前,但它没有意识到它已经结束,调用ReadLine 再次,并以一种 smiliar 的方式挂到 ReadToEnd。一个肮脏的解决方法是,如果当前行以“>”结尾,则将其视为响应的结尾,但是如果一行在响应中的任何地方以这种方式结束,它就会分崩离析.

我试过一个字符一个字符地遍历流,最后没有发送特殊字符。

有什么想法吗?

注意:我的最终目标是提供一个轻型库,我可以使用它来执行任何 DOS 可执行文件(这可能需要传递给它的几个类型命令,而不仅仅是打开时通过命令行传递的一次性参数),解析结果返回正则表达式模板,并返回提取的结果。我想如果我可以在 Windows 应用程序中有效地重新实现 cmd.exe,那么这样的库将是可能的。

谢谢,李

最佳答案

我怀疑你的方法行不通。 cmd.exe 不会通过 StandardOutput 与您沟通您运行的命令何时或是否已完成。 (我应该指出,尽管这不会阻止您运行多个命令。您可能只发送命令行,实际上并不需要等待它完成。)

也许更合适的方法是完全不使用 cmd.exe。相反,使用 Process.Start() 来运行每个单独的命令。然后你可以使用StandardOutput.ReadToEnd(),当进程结束时它会结束,你可以运行下一个。

关于c# - 用 C# 编写的 cmd.exe 样式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449029/

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