gpt4 book ai didi

c# - 在 C# 中以编程方式使用 cmd.exe

转载 作者:太空宇宙 更新时间:2023-11-03 21:48:01 24 4
gpt4 key购买 nike

  1. 我想通过 C# 在 cmd.exe 上运行一系列命令。
  2. 我只需要打开一个cmd窗口
  3. 我需要在执行过程中和完成后保持 cmd 窗口打开。
  4. 我需要在打开的 cmd 窗口中显示命令[edit][/edit] 执行以及命令的输出。

所以基本上我想像手动用户一样打开和使用 cmd.exe。我尝试了一些方法,但没有一个方法可以完成以上 4 项。

下面的代码有效但不显示命令/输出并在完成后终止。有帮助吗?

Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
info.RedirectStandardInput = true;
info.UseShellExecute = false;
info.CreateNoWindow = false;
info.Arguments = "/k";

p.StartInfo = info;
p.Start();

using (StreamWriter sw = p.StandardInput)
{
if (sw.BaseStream.CanWrite)
{
sw.WriteLine("dir");
sw.WriteLine("ipconfig");
}
}

最佳答案

RedirectStandard... 属性具有误导性。一旦设置了其中之一,所有三个流都将被重定向。这是因为底层 Windows API 只有一个标志来控制重定向 - STARTF_USETDHANDLES

因为您没有将 RedirectStandardOutput 属性设置为 true,stdout 流对您的代码不可用,而是会被重定向到 Console.Out 您自己的流程流。因此,只要父进程是控制台应用程序,您的代码就可以正常工作;但在 Windows 应用程序中,输出被重定向到虚无。

一个简单的解决方法是暂时将您的父进程变成控制台应用程序:

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeConsole();

static void Main(string[] args)
{
Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
info.RedirectStandardInput = true;
info.UseShellExecute = false;
info.CreateNoWindow = false;

p.StartInfo = info;
AllocConsole();
p.Start();
FreeConsole();


using (StreamWriter sw = p.StandardInput)
{
if (sw.BaseStream.CanWrite)
{
sw.WriteLine("dir");
sw.WriteLine("ipconfig");
}
}
}

至于保持控制台打开:您可以删除 FreeConsole() 调用,这样父进程即使在 cmd.exe 退出后也能保持控制台。但是,如果您需要多个控制台,这可能会成为一个问题,因为您的父进程一次不能与多个控制台相关联。

或者,不要关闭输入流,以便 cmd.exe 继续运行。

关于c# - 在 C# 中以编程方式使用 cmd.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945016/

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