web-dev-qa-db-ja.com

出力をファイルにリダイレクトして、バッチスクリプトでコンソールに出力を強制します

とりわけ環境をセットアップしてビルドを行うバッチファイルがあります。 stdout(スクリプト出力)とstderr(コンパイラエラー)の両方が別々のファイルにリダイレクトされます。バッチファイルのリダイレクトに関係なく、バッチファイルが特定のコマンドの出力をコンソールに強制的に送信することは可能ですか?

これは、リダイレクトしてはならない重要なメッセージの場合があります。または、より具体的には、スクリプトにcolorコマンドを挿入して、コンソールの前景色と背景色を設定し、コンソールを他の目的に再利用しないように警告します(環境が変更されたため)。 stdoutがリダイレクトされるとき、colorはコンソールの色を変更しません。

1
Firstrock

私のコメントを示すために:

:: 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

LotPingsがコメントと回答で述べているように、いつでも>conを介してコンソールに出力を送信できます(末尾の:は必要ありません)。

ただし、conに送信すると、すべての機能が正しく機能するわけではありません。たとえば、clsは画面を適切にクリアしません。

もう1つのオプションは、ファイルにリダイレクトする前に元のstdoutのコピーを保存してから、保存したハンドルに特別なコマンドを送信することです。

@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は元の標準出力(コンソール)を指すため、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がまだ使用されていないことを保証できないため、暗黙的な保存に依存するのは好きではありません。そのため、正しい結果が得られない可能性があります。指定した未使用のハンドルに明示的に保存することをお勧めします。

3
dbenham