Windows 将stdin复制到stdout的命令

Windows 将stdin复制到stdout的命令,windows,cmd,Windows,Cmd,我正在更新Crystal编程语言标准库的测试套件,以在Windows上运行。为了测试在unix上使用stdout和stdin管道生成的新进程,cat用作将stdin复制到stdout进行测试的“虚拟进程” 使用cmd.exe命令在windows上实现相同效果的最简单命令是什么?可以在所有windows版本中找到的一个简单命令,可以在指定场景中用作linuxcat命令的替代品: find /v "" 按原样,它将从标准输入读取行,并将它们写入标准输出 注意:虽然有时可以使用more和findst

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


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

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

find /v ""
按原样,它将从标准输入读取行,并将它们写入标准输出

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

以下是我的解决方案:

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更好,因为它避免了上述问题。

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