Windows cmd.exe:将stdout和stderr重定向到文件后,它仍然会将行打印到控制台窗口

Windows cmd.exe:将stdout和stderr重定向到文件后,它仍然会将行打印到控制台窗口,windows,cmd,command-line,windows-console,Windows,Cmd,Command Line,Windows Console,我在Windows 10中的cmd.exe下执行了一个.bat文件,并将标准输出和标准错误重定向到一个文件: C:\MyFolder> Foo.bat 2>&1 1>x.txt 但它仍然会将一些行打印到控制台窗口,而这些行不会写入文件 这怎么可能?这些行在什么输出上打印到控制台窗口 如何将这些行重定向到文件 将stdout(1)和stderr(2)重定向到同一个文件的正确方法是按以下确切顺序重定向它们: 这适用于Windowscmd.exe,也适用于Linuxbas

我在Windows 10中的cmd.exe下执行了一个.bat文件,并将标准输出和标准错误重定向到一个文件:

C:\MyFolder> Foo.bat 2>&1 1>x.txt
但它仍然会将一些行打印到控制台窗口,而这些行不会写入文件

  • 这怎么可能?这些行在什么输出上打印到控制台窗口
  • 如何将这些行重定向到文件

    • stdout
      1
      )和
      stderr
      2
      )重定向到同一个文件的正确方法是按以下确切顺序重定向它们:

      这适用于Windows
      cmd.exe
      ,也适用于Linux
      bash
      shell

      在您的版本中(顺序错误)
      stderr
      不会重定向到文件,而是在控制台窗口中打印。因此,最有可能出现在控制台窗口中的行被打印到
      stderr


      程序(可能由
      Foo.bat
      调用)绕过该文件的另一种方式是使用
      CONOUT$
      直接写入控制台的活动屏幕缓冲区。无法将其重定向到文件。

      控制台应用程序可以打开CONIN$和CONOUT$直接访问控制台。重定向标准句柄对此没有影响。您必须包含一个可复制的示例。应用程序可以通过多种方式写入控制台窗口,而不会对标准I/O产生任何影响。如果有问题需要解决,则必须说明如何导致问题。具体点。@Luaan:我知道,但我没能找到一个可以发表的小例子。我有一个庞大的构建系统,一个
      make.bat
      对我来说就是这样。这个BAT启动了很多程序(CAMI,编译C++,PL,PY,java)。总的来说,我很高兴得到一个答案。例如,有哪些方法可以绕过stdout和stderr并仍然写入控制台?我有所有这样做的源代码,不知道要搜索什么。如果你找不到罪魁祸首,我们肯定不能:)一块一块地隔离所有内容,即使这意味着在不同的点破坏脚本,直到找到导致问题的第一个命令。是的。除此之外,我仍然认为,一个普遍的答案对社会是有益的。让我们收集所有可以绕过stdout和stderr的方法(可能在社区wiki答案中)。到目前为止,@ErykSun对的评论是最有用的。
      C:\MyFolder> Foo.bat 1>x.txt 2>&1