Dos 和/或 Windows 版本的 Unix SCRIPT 命令

Dos 和/或 Windows 版本的 Unix SCRIPT 命令

在大学的时候,当我们要在计算机科学中提交作业时,我们必须执行一系列步骤,包括运行script, date, whoami, etc.,然后运行我们的程序。

script命令将把发送到显示器的所有文本传输到显示器和指定的文件。

从那时起,我就一直在寻找 Dos 和/或 Windows 版本,但一无所获。有些程序可以重定向到文件,但显示内容不会回显,而有些程序似乎根本无法使用重定向。

有任何想法吗?


编辑

到目前为止,我得到的答案似乎与标准重定向命令 ( <, >, |) 完全一样。这些并不适用于所有程序。例如,Microsoft C++ 编译器 CL.EXE。如果您运行cl /?重定向命令或通过另一个程序 (例如 TEE) 进行管道传输,您将无法获得标题/横幅文本。

另一个例子是我之前用 Pascal 编写的一个程序(我认为最后一次编译是在 FreePascal 中)。帮助文本根本没有重定向。我也看到过这种情况发生在其他程序中,例如 MKISOFS。它有一个很长的帮助文本,但不能通过 MORE 管道传输或重定向到文件来暂停!

多年来我一直对此感到疑惑。我曾经认为这可能是因为文本被直接写入屏幕(例如端口 B800)或其他原因,但我尚未确定原因,更不用说找到可以完成这项工作的程序了。

答案1

看一眼赛格威,它使您可以访问 Windows 中所有那些出色的 UNIX 命令行工具。

答案2

好的,像往常一样,我决定自己编写程序。今晚我有点空闲时间,就匆匆忙忙地编写了一个本机(即非 Cygwin)测试程序,它完全按照我的期望运行,尽管有两个限制。(我没有始终在线的主机,但我会清理程序、编写文档并发布它。)

  1. 它无法捕获直接写入视频硬件(或虚拟化硬件,视情况而定)的程序的输出,因此,除非我重新编译它,否则无法捕获我提到的 Pascal 程序。直接的标志设置——当我用 FreePascal 重新编译它时,它就变得没有必要了。

  2. 它无法接收来自标准错误。例如,如果您执行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 上。摘要:

答案4

通用帕斯卡常见问题解答解释原因,以及 Turbo Pascal 程序的解决方案。

问:当我将程序的屏幕输出重定向到文件时,文件为空,而输出仍然显示在屏幕上。我做错了什么?

答:您可能正在使用 CRT 单元,其默认写入 stdout 的方法是通过直接屏幕写入。为了使输出能够重定向,所有写入都必须通过 DOS 完成。将变量 DirectVideo 设置为 false 对重定向没有影响,因为它所做的只是使用 BIOS 进行屏幕写入 - 而不是 DOS。

要启用重定向,您不能使用 CRT 单元

或者

assign(output,'');
rewrite(output);

这将使所有输出都通过 DOS,因此可以根据需要进行重定向。要恢复默认情况:

AssignCRT(output);
rewrite(output);

相关内容