在批处理脚本中强制输出到控制台,并将输出重定向到文件

在批处理脚本中强制输出到控制台,并将输出重定向到文件

我有一个批处理文件,它除了设置环境之外还执行构建。stdout(脚本输出)和 stderr(编译器错误)都重定向到单独的文件。批处理文件是否可以强制将给定命令的输出发送到控制台,而不管批处理文件上的重定向如何?

这可能是一条不应重定向的重要消息。或者更具体地说,color在脚本中放置一个命令来设置控制台前景色和背景色,以提醒我不要将控制台重新用于其他用途(因为环境已被改变)。当 stdout 被重定向时,color不会更改控制台颜色。

答案1

为了证明我的评论:

:: Q:\Test\2018\08\10\SU_1347898.cmd
@Echo off
cls
( Echo normal output 1 redirected with the code block
  net file returns an error
  Echo *** this line should go directly to Console *** >CON:
  Echo normal output 2 redirected with the code block
) 1>SU_1347898_.txt 2>SU_1347898_Error.log
echo(
findstr "^" %~n0_*

示例输出:

*** this line should go directly to Console ***

SU_1347898_Error.log:Die Syntax dieses Befehls lautet:
SU_1347898_Error.log:
SU_1347898_Error.log:NET FILE
SU_1347898_Error.log:[id [/CLOSE]]
SU_1347898_Error.log:
SU_1347898_.txt:normal output 1 redirected with the code block
SU_1347898_.txt:normal output 2 redirected with the code block

答案2

正如 LotPings 在他的评论和回答中所说,您始终可以通过以下方式将输出直接发送到控制台(请注意,不需要>con尾随)。:

但当指向 时,并非所有功能都能正常工作con。例如,cls无法正确清除屏幕。

另一种选择是在重定向到文件之前保存原始标准输出的副本,然后将特殊命令定向到保存的句柄。

@echo off
9>&1 1>stdout.txt 2>stderr.txt (
  echo Most output goes to a file
  echo Hello world
  >&9 echo But this goes to the original definition of stdout - the console
)

请注意,每次重定向现有句柄时,在执行重定向之前,原始定义都会保存到第一个可用的未定义句柄中。因此,假设之前没有任何重定向,则下面的 &3 将指向原始 stdout(控制台),因此无需明确保存到 9。

@echo off
1>stdout.txt 2>stderr.txt (
  echo Most output goes to a file
  echo Hello world
  >&3 echo But this normally goes to the original definition of stdout - the console
)

但我不喜欢依赖隐式保存,因为我不能保证 3 尚未被使用,所以我可能无法获得正确的结果。最好明确保存到您指定的未使用的句柄中。

相关内容