无法在Windows命令提示符(cmd.exe)中重定向输出消息

9

我尝试在Windows命令提示符中运行以下命令。

abc.exe >log.txt 2>&1

我希望所有来自abc.exe的输出都能被重定向到log.txt,但实际上并没有起作用,因为log.txt是空的。
然而,如果我只是执行abc.exe,输出会显示在Windows命令提示符中。
我不确定该应用程序使用的是哪种输出处理程序(STDOUT还是STDERR),但我想知道是否有一种方法可以捕获所有消息,而不管处理程序如何。

尝试执行 perl abc.exe >log.txt 2>&1 - run
嗨 Johnston,它确实生成了文件,但是文件是空的。输出没有进入控制台。 - TimMe
1
听起来好像程序中的一个错误导致了输出重定向时崩溃。你联系过供应商了吗? - Harry Johnston
2
你解决过这个问题吗? - Rachael
当输入 abc.exe >con 2>&1 时,您会看到什么? - aschipfl
显示剩余2条评论
2个回答

1

补充:自Windows 10 v1809起,Windows 终于支持伪控制台。如果可用,这比使用传统的控制台API提供了更好的解决方案。


如果你真的需要捕获那个消息,使用控制台 API

CreateConsoleScreenBufferSetConsoleActiveScreenBuffer 允许您切换到专用屏幕缓冲区,避免干扰现有的屏幕缓冲区。

SetConsoleScreenBufferSize 可以使缓冲区足够宽,以避免行溢出。

SetConsoleCursorPosition 可以根据需要设置光标位置。

程序运行后,ReadConsoleOutput 允许您读取它写入控制台的内容。

然后可以使用 GetStdHandle(STD_OUTPUT_HANDLE)SetConsoleActiveScreenBuffer 将控制台返回到原始缓冲区,并使用 CloseHandle 关闭额外的缓冲区。


1
谢谢大家的讨论。结果证实Jonston是正确的,供应商承认这个程序中有一个错误,导致消息无法正确地重定向。然而,对我来说似乎很奇怪,错误可以被打印到Windows控制台上,但我们却无法以编程方式捕捉它。 - TimMe
1
“这是一种特性,而不是一个错误”:(echo hello & echo world>con)>file.txt 命令会将 world 输出到屏幕上,而你只能将 hello 写入文件。这样可以确保用户在代码块或整个脚本被重定向时仍能在屏幕上看到关键信息。 - Stephan
@Stephan,在这种情况下不是这样的:当输出被重定向时,所涉及的程序没有生成任何输出,甚至没有到控制台。该代码可能假设标准输出是一个控制台句柄(并使用特定于控制台的API调用),而不是自己打开控制台句柄。 - Harry Johnston

0
当将控制台输出重定向到文件时,看不到输出的症状可能是由于程序中写入标准输出的缺少flush()引起的。但是,当程序正常退出或相应的缓冲区填满并自动刷新时,输出应该是可见的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接