为啥我不能重定向由另一个批处理调用的批处理文件运行的程序的标准输出/错误?

Posted

技术标签:

【中文标题】为啥我不能重定向由另一个批处理调用的批处理文件运行的程序的标准输出/错误?【英文标题】:Why can't I redirect stdout/err of a program run by a batch file, called by another batch?为什么我不能重定向由另一个批处理调用的批处理文件运行的程序的标准输出/错误? 【发布时间】:2021-06-02 15:13:11 【问题描述】:

如果我有这批:

ScriptA.bat

someprog.exe

还有这个:

ScriptB.bat

CALL ScriptA.bat

然后我执行如下命令:

ScriptB.bat > test.log

someprog.exe 的输出未被记录。它流向控制台。如何避免将someprog.exe 的输出显式传输到文件,而只是从更高级别捕获?

(请注意,我最终希望通过大量脚本从这些嵌套中启动各种 exe 来执行此操作,并且我无法全部编辑它们以重定向它们调用的每个子进程的输出)。

【问题讨论】:

您肯定FOO.exe 不是故意写入CON 设备? 我测试了你的确切场景,但我在A.bat 中使用了IPCONFIG.exe。我相应地执行了B.batB.bat>output.logipconfig 的所有输出都被放入日志文件中。如果您认为需要重定向 STDOUT 和 STDERR,请执行以下操作:B.bat>output.log 2>&1 嗯...在我正在测试的这种情况下,这是可以想象的,但它是第三方实用程序。我不确定我将如何确定? 应该很容易测试程序是否仅输出到CON 设备。只需执行带有重定向的程序:someprog.exe >output.log 2>&1。如果它写入控制台,那么您知道它只写入CON 而不是STDOUTSTDERR 你不能使用批处理文件。您也许可以使用其他一些可以从控制台窗口刮取输出的第 3 方实用程序来做到这一点。我见过人们谈论它,但我从未跟进过他们使用什么工具来做这件事。 【参考方案1】:

我在另一个 SO 线程上找到了答案:

https://***.com/a/11955380/3220983

如果阅读问题下的 cmets,您会看到,我遇到的问题是我无法捕获的消息根本没有通过管道传输到 stdout 或 stderr!他们通过类似于CON 重定向的方式从我尝试使用的特定可执行文件内部直接进入控制台。

我发布的链接显示了如何从批处理脚本启动 PowerShell 脚本,该脚本捕获整个控制台窗口内容,包括 CON 输出!

【讨论】:

以上是关于为啥我不能重定向由另一个批处理调用的批处理文件运行的程序的标准输出/错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 .htaccess 文件的 301 重定向不能正常工作?

无法在 ajax 中处理 302 重定向,为啥? [复制]

为啥下面的系统调用输出不重定向到文件?

重定向 Windows 批处理文件命令的回显

将传递的参数重定向到 Windows 批处理文件 [重复]

C++ 运行批处理文件而不重定向输出