在大学的时候,当我们要在计算机科学中提交作业时,我们必须执行一系列步骤,包括运行script, date, whoami, etc.
,然后运行我们的程序。
该script
命令将把发送到显示器的所有文本传输到显示器和指定的文件。
从那时起,我就一直在寻找 Dos 和/或 Windows 版本,但一无所获。有些程序可以重定向到文件,但显示内容不会回显,而有些程序似乎根本无法使用重定向。
有任何想法吗?
编辑:
到目前为止,我得到的答案似乎与标准重定向命令 ( <, >, |
) 完全一样。这些并不适用于所有程序。例如,Microsoft C++ 编译器 CL.EXE。如果您运行cl /?
重定向命令或通过另一个程序 (例如 TEE) 进行管道传输,您将无法获得标题/横幅文本。
另一个例子是我之前用 Pascal 编写的一个程序(我认为最后一次编译是在 FreePascal 中)。帮助文本根本没有重定向。我也看到过这种情况发生在其他程序中,例如 MKISOFS。它有一个很长的帮助文本,但不能通过 MORE 管道传输或重定向到文件来暂停!
多年来我一直对此感到疑惑。我曾经认为这可能是因为文本被直接写入屏幕(例如端口 B800)或其他原因,但我尚未确定原因,更不用说找到可以完成这项工作的程序了。
答案1
看一眼赛格威,它使您可以访问 Windows 中所有那些出色的 UNIX 命令行工具。
答案2
好的,像往常一样,我决定自己编写程序。今晚我有点空闲时间,就匆匆忙忙地编写了一个本机(即非 Cygwin)测试程序,它完全按照我的期望运行,尽管有两个限制。(我没有始终在线的主机,但我会清理程序、编写文档并发布它。)
它无法捕获直接写入视频硬件(或虚拟化硬件,视情况而定)的程序的输出,因此,除非我重新编译它,否则无法捕获我提到的 Pascal 程序。直接的标志设置——当我用 FreePascal 重新编译它时,它就变得没有必要了。
它无法接收来自标准错误。例如,如果您执行
cl /? | script.exe c:\test.log
,则只有 Microsoft 编译器的帮助文本会发送到文件;横幅只会显示在屏幕上。(由于程序的工作方式,这有点令人困惑,所以我要研究一下。)
对此问题几乎无能为力(1)(如果有聪明人能找到拦截直接屏幕写入的方法,我不会感到惊讶,但无论从哪方面来看,这可能都不太可能。)
问题(2)可以通过将 stderr 重定向到 stdout 然后再进行管道传输来解决,如下所示。虽然不太美观(或不太方便,但确实有效)。
cl /? 2>&1| script.exe c:\test.log
它可能/应该也可以从程序方面实现,从而简化管道,但我还没有找到任何关于如何实现的信息(至少以“正常/官方”的方式,例如通过 C++)。我确实有一个想法,即在中断向量表中安装一个中断处理程序来拦截对通用输出 API 函数的调用,这可能会/很可能会起作用。事实上,在 1998 年,我编写了一个实验性的 DOS TSR(也适用于 Windows NTVDM),它可以拦截输出函数并在将它们发送到屏幕之前对它们进行着色(即通用语法着色)。将它调整为将副本发送到文件应该很容易。
答案3
不幸的是,你似乎找不到现成的 Microsoft 解决方案。你可以查看类似帖子在 StackOverflow 上。摘要:
- 看着那(这SourceForge 上的 tee 的 Win32 移植版
- 使用 Cygwin,正如 Frank Szczerba 所提到的
- 看着Rob van der Woude 的 T 恤实现在 DOS 批处理脚本中
- 其他一些观点
答案4
这通用帕斯卡常见问题解答解释原因,以及 Turbo Pascal 程序的解决方案。
问:当我将程序的屏幕输出重定向到文件时,文件为空,而输出仍然显示在屏幕上。我做错了什么?
答:您可能正在使用 CRT 单元,其默认写入 stdout 的方法是通过直接屏幕写入。为了使输出能够重定向,所有写入都必须通过 DOS 完成。将变量 DirectVideo 设置为 false 对重定向没有影响,因为它所做的只是使用 BIOS 进行屏幕写入 - 而不是 DOS。
要启用重定向,您不能使用 CRT 单元
或者
assign(output,''); rewrite(output);
这将使所有输出都通过 DOS,因此可以根据需要进行重定向。要恢复默认情况:
AssignCRT(output); rewrite(output);