【问题标题】:Command which copies stdin to stdout将标准输入复制到标准输出的命令
【发布时间】:2018-09-14 11:14:58
【问题描述】:

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

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

【问题讨论】:

  • 你可以试试find /v ""
  • 或者,如果您的测试发送的行数不超过 65535 行并且进程的标准输出也被重定向(不是控制台),您可以简单地使用 more
  • @MCND find /v "" 很适合我,你能把这个作为答案发送吗?

标签: windows cmd


【解决方案1】:

在所有windows版本中都可以找到一个简单的命令,可以在指定的场景中用作linux cat命令的替代品

find /v ""

照原样,它将从标准输入读取行并将它们写入标准输出。

注意:虽然 morefindstr "^" 有时可以使用,但两者都有一些限制,使 find /v "" 成为更好的选择。

【讨论】:

    【解决方案2】:

    这是我的解决方案:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 1970-01-01
      • 2011-03-09
      • 2021-04-29
      • 1970-01-01
      • 2022-08-14
      • 2013-09-18
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多