C#——如果没有数据通过管道传输到程序,Console.In.ReadToEnd() 在用户输入时挂起

标签 c# command-line console pipe

我正在编写一个采用 2 个参数的 C# 控制台应用程序:myprogram.exe param1 param2

param2 是可选的,如果它不存在,则获取管道数据:

echo "hithere" | myprogram.exe param1

我通过在仅传递 1 个参数时捕获 Console.In.ReadToEnd() 使这部分工作。

我面临的问题是当只传递 1 个参数并且没有数据通过管道传输时,它只是坐在那里听用户输入并且关闭的唯一方法是 Ctrl+C 到结束程序。

相反,如果只提供了 1 个参数并且没有数据通过管道传输,有没有办法返回错误并退出程序?


为了测试是否有任何东西在等待,我试过使用:

  • Console.OpenStandardInput().CanRead
  • Console.OpenStandardInput().Length
  • Console.In.Peek()

那没用。

我还尝试了这个 stackoverflow 问题底部提到的“hack”:C# Console receive input with pipe .

有什么想法吗?

最佳答案

与其检查控制台,不如检查命令行。如果他们传递了足够多的参数,那么就假设没有什么可以从控制台得到的。如果他们没有指定足够的参数,则假定 URL 将来自控制台。您不需要使用 ReadToEnd(),只需使用 ReadLine(),这样您就可以逐行进行。如果您使用 ReadToEnd(),则必须按 CTRL+Z(或 Linux 中的 CTRL+D)来指示输入流的结尾。

关于C#——如果没有数据通过管道传输到程序,Console.In.ReadToEnd() 在用户输入时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4419592/

相关文章:

c# - MemoryStream 的 byte[] 缓冲区可以有可变大小吗?

混帐上传包 : command not found

python - 从 mac 终端运行 python

c++ - 在控制台应用程序中使用 ocx

黑莓控制台输出

c# - 起订量错误 : "Expected invocation on the mock at least once, but was never performed"

c# - 如何使用命名空间在 Visual Studio 中处理主项目和子项目

c# - c# 中多播委托(delegate)中的执行顺序

linux - 使用 IPTABLES 的 MAC 地址字节计数器

c++ - 是否可以通过标准 C++ IOStream 在 Shell 中显示可编辑文本?