【问题标题】:stdin → stdout?标准输入→标准输出?
【发布时间】:2013-09-18 05:12:02
【问题描述】:

Unix echo foo | cat 的等价物是什么?

ECHO foo | TYPE CON 挂起,等待输入,至少在 Windows XP/SP3 上是这样。可能CON 不是标准输入而是键盘输入。

您可能想知道这个练习的意义何在:有些程序在注意到它们的输出是管道时会表现出不同的行为,我想要一种方法来测试它们。

【问题讨论】:

  • 你想完成什么? echostdin 不同,并且根据定义已被定向到 stdout,因此在这种情况下到 cat 的管道是多余的。
  • @Dan 刚刚用关于为什么的信息更新了问题。
  • 你能举个例子吗?
  • @foxidrive: 引用Node.js documentation: "当目标是终端或文件时,控制台函数是同步的(以避免在过早退出的情况下丢失消息),而当它是异步的管道(避免长时间阻塞)。”
  • Dan 的问题 - 你想要完成什么?将有助于定义实际问题,看看是否有解决方法。

标签: windows batch-file cmd


【解决方案1】:

不确定您想做什么,但这可能会有所帮助:

type file|more

这可能更适合您的需求。

foo.exe | findstr "^"

【讨论】:

  • echo foo | more 是最接近的别名,但我仍然不确定他的目标是什么。
  • MORE 对我来说没问题。不过它并不完美,因为它是分页的,我既不需要也不想要。因此,我暂时保留这个问题,希望有更好的解决方案。
  • 我非常喜欢 findstr 解决方案!
  • +1,FINDSTR 是更好的选择,因为 MORE 会将制表符转换为空格。如果输入足够大,我相信 MORE 最终会挂起。
【解决方案2】:

据我了解,您正在寻找一个可以通过管道传输的应用程序,该应用程序只需将通过管道传输到它的任何内容传递到标准输出。

我相信foo.exe | more 将在 Windows 上达到您的目的。

注意:more 确实具有分页输出的副作用,因此如果您需要测试更长的输出,您可以编写一个简单的应用程序来执行重定向。

编辑:您可以编写一个简单的批处理文件来将标准输入重定向到标准输出并通过管道传输到该文件。 来自jeb的回答here

@echo off
setlocal DisableDelayedExpansion

for /F "tokens=*" %%a in ('findstr /n $') do (
  set "line=%%a"
  setlocal EnableDelayedExpansion
  set "line=!line:*:=!"
  echo(!line!
  endlocal
)

将其保存为 redir.bat 并像这样使用foo.exe | redir.bat。在Win7上测试。与默认的 Windows 安装兼容。唯一的缺点是它不容易记住。

对于简单的情况,我会使用 more,而对于更长的输出,我会使用它。

【讨论】:

  • foo.exe | tee 将提供未分页的输出 - 如果他选择了合适的第三方 tee 过滤器
  • 我确实安装了tee,来自GnuWin。我希望在 Windows 中包含一些东西。我正在测试的程序(基于 Node.js)检测到 >| 不同。
  • foo.exe |repl "(.*)" "$1" 可能有效,其中 repl 是一个名为 repl.bat 的辅助批处理文件,来自 - dostips.com/forum/viewtopic.php?f=3&t=3855
  • 好计划。这个问题很混乱,所以思维模式很混乱 - 你可以使用foo.exe | findstr "^"