Windows 中的 more 命令是否只影响输出,还是也影响命令执行?

Windows 中的 more 命令是否只影响输出,还是也影响命令执行?

我在 Win XP 上通过命令行 (devenv.exe /rebuild) 在 Visual Studio 2005 中运行软件构建。我通过管道将其传输到 more,然后意识到我不想照看它,所以我用 Q 退出了 more。现在我在 CMD 窗口中看不到任何内容。命令是否正常运行,more 是否只是缓冲并显示 STDOUT,并且它会继续运行,尽管 more 已退出,还是这个构建现在永远无法完成?

答案1

有趣的问题!

您通过管道传输到 MORE 的进程将继续运行,直到其自然完成或您将其终止。以下测试可展示这一点:

打开 2 个 cmd 窗口。

在提示符下运行:ping -n 120 127.0.0.1 | more

在提示符下运行:tasklist | findstr /I ping

ping 将运行大约 120 秒,但使用标准 cmd 窗口将在更短的时间内达到满页(相应地调整 ping 命令)。

您可以在第二个提示中显示,无论您是否使用“Q”终止 MORE,PING 都会继续运行。只有使用 ctrl+C 完全终止 PING 命令,或等待整整 50 秒,ping 才会停止。

答案2

是的,more即使您不滚动输出,缓冲区和进程仍会继续运行。

但是,如果你more提前退出,nonexistent pipe错误在某些情况下会出现这种情况。这似乎不会影响执行,很可能是由于所使用的测试方法。


我们可以用一个简单的批处理文件来测试:

@echo off
for /l %%a in (1,1,100) do echo %%a
msg * done

通过将其放入管道中more,很明显无论是否more滚动,该过程都会继续执行:我们done无需前进就能看到消息more

但是,如果我们像这样增加运行时间,并moreq命令中间退出:

@echo off
for /l %%a in (1,1,10000) do echo %%a
msg * done

我们收到很多错误消息:

The process tried to write to a nonexistent pipe.

消息框仍然出现。使用简单的 C# 或 C 程序重新测试不会复制此行为。我的猜测是,如果流已经打开,它将照常进行(无输出) - 但echo上述测试中使用的命令实际上每次都尝试重新打开流,一旦管道目标关闭,就不再可能了。

相关内容