c# - RedirectStandardOutput 和批处理文件中的暂停命令

标签 c# .net redirectstandardoutput

在我的 C# 代码中,我必须运行一些外部进程。这些可以是批处理文件或可执行文件。我通过将 ProcessStartInfoRedirectStandardOutput 设为 true,将输出重定向到我自己的窗口。这使得用户即使在外部进程完成后也可以查看输出。我还重定向输入,以便用户可以在必要时按键。一般来说,这非常有效。

但是,我有一个问题。某些批处理文件使用 PAUSE 命令。显然,在按下某个键之前,命令不会刷新输出。因此,用户永远不会看到提示。因此,只有在按下某个键后,用户才会看到他应该按下某个键才能继续。有没有办法让这个工作(除了“不使用暂停”)?

编辑:批处理文件运行用户的 CAM 后处理器,通常由用户(或用户的 IT 部门)创建。因此,要求更改这些文件或通过创建pause.exe进行“黑客攻击”并不是真正可行的解决方案(除非作为最后的手段)。

最佳答案

在 CMD 中,尝试

batchWithPause.bat < nul

在 C# 中,类似于:

 Process.Start("batchWithPause.bat", "< nul");

编辑 所以您只是想让用户看到“按任意键继续”? 然后添加

@echo "Press any key to continue..."

每次暂停调用之前。您还可以:

  1. 编写您自己的pause.bat来实现这一点
  2. 编写一个简单的pause.exe,用c#表示:

    公共(public)静态无效暂停() { Console.WriteLine("按回车键继续。"); 控制台.Read(); }

编辑2我现在明白你的问题了。仅在用户按下某个键后,异步 OutputDataReceived 和 StreamReader.ReadLine() 才会读取暂停的“按任意键继续”。但是,如果您自己循环 StreamReader.Read(),您还会得到“按任意键继续”。所以这似乎是你唯一可能的路线。

关于c# - RedirectStandardOutput 和批处理文件中的暂停命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995151/

相关文章:

c# - PrincipalContext.ValidateCredentials 为空密码返回 true 是什么?

C# 在运行时获取进程输出

c# - Array.sort(或任何集合排序方法)是否取决于 C# 中单个项目的大小?

c# - 如何从 json 序列化 protobuf,并自动忽略 C# 中的未知字段?

c# - WPF如何设计一个多窗口应用程序?

c# -/平台 :anycpu32bitpreferred is not a valid setting for option/target:library or/target:module

c# - xml序列化同时指定xmlelement和xmlattribute

.net - 在MVVM中,每个 View 模型只能有一个 View 吗?

c# - 为什么在重定向批处理脚本的输出时在 C# 中得到不同的退出代码?