将stdin复制到stdout的命令

时间:2018-09-14 11:14:59

标签: windows cmd

我正在更新Crystal编程语言标准库的测试套件以在Windows上运行。为了在UNIX上使用stdout和stdin的管道测试新进程的产生,cat用作“虚拟进程”,将stdin复制到stdout进行测试。

使用cmd.exe命令在Windows上实现相同效果的最简单命令是什么?

1 个答案:

答案 0 :(得分:0)

这是我的解决方案:

powershell.exe -c "[Console]::OpenStandardInput().CopyTo([Console]::OpenStandardOutput())"

使用 (find /v "") 的公认解决方案存在一些问题:

  • 它会破坏二进制数据。它尝试将输入读取为带有 CRLF 行结尾的文本。如果您传递不包含换行符的数据,它将在最后输出一个 CRLF。如果一行超过其行数限制(4091 个字符),它也会失败
  • 当输入为空时,它返回退出代码 1。相比之下,当输入为空时,Unix cat 将返回退出代码 0。当输入为空时,测试退出代码并期望它为零的测试将失败。一种解决方法是执行 find /v "" & :(假设您是从 cmd.exe 运行它,例如使用 cmd.exe /c) – 但是,如果 find 实际上由于任何原因无法运行(请参阅下一步要点),您将不会收到通知您的失败退出代码
  • 在某些系统上,在 Windows find 之前,您的路径中可能有 MSYS/Cygwin/etc find。 (当然,在这种情况下,您的路径中可能也有 cat,因此根本不需要这样做 – 但是,您可能正在寻找一种您知道即使在没有MSYS/Cygwin/etc 已安装。)假设您使用 cmd.exe /c 运行它,您可以使用 %windir%\system32\find.exe /v ""
  • 解决此问题

我认为这个 PowerShell oneliner 更好,因为它避免了上述问题。