3

Unixシェルスクリプトでは、次のように、スクリプト自体からstderrとstdoutをリダイレクトできます。

#!/bin/ksh
# script_name: test.sh
export AUTO_LOGFILE=`basename $0 .sh`.log
# stdout and stderr Redirection. This will save the old stdout on FD 3, and the old stderr on FD 4.
exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1
echo "Hello World"
# The above echo will be printed to test.log

実際、test.shは次のように簡単に実行できます。

test.sh

それ以外の:

test.sh >> test.log 2>&1    

私はバッチスクリプトで同様のことをしようとしています。私のバッチコードは次のとおりです。

@echo off & setlocal enableextensions enabledelayedexpansion
REM script_name=test.bat
set AUTO_LOGFILE=%~n0.log
REM How to do the stdout and stderr redirection from within the script itself here?

バッチスクリプト自体からstderrとstdoutをリダイレクトするにはどうすればよいですか?私がもっと興味を持っているのは、このUNIXシェルスクリプトステートメントを同等のバッチコードに変換することです。

exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1
4

2 に答える 2

5

以下のtest.batバッチ ファイルは、Unix スクリプトと機能的に同等です。つまり、すべての標準出力をログ ファイルに送信し、エラー出力を画面に送信します。

@echo off
if defined reEntry goto reEntry
set reEntry=TRUE

set AUTO_LOGFILE=%~N0.log
rem stdout Redirection. Leave stderr as is.

"%~F0" %* >>%AUTO_LOGFILE%

:reEntry
set reEntry=
echo "Hello World"
rem The above echo will be printed to test.log
rem and error messages will be printed to the screen:
verify badparam

補遺:

OPはstdoutをstderrから分離して画面にエラーメッセージを表示したいと思っていましたが、おそらく彼を誤解していました。stdout と stderr の両方をファイルに送信するには、dbenham がコメントで指摘したように、以下の行を使用します。

"%~F0" %* >>%AUTO_LOGFILE% 2>&1

または、上記のコメントですでに提案されているさらに簡単な方法で:

@echo off
set AUTO_LOGFILE=%~N0.log
rem stdout and stderr Redirection.

call :Main %* >>%AUTO_LOGFILE% 2>&1
goto :EOF

:Main
echo "Hello World"
rem The above echo will be printed to test.log

ただし、エラーメッセージを通常の出力と区別することが目的の場合は、次のトリックを使用して同じ画面で実行できます。

"%~F0" %* 2>&1 1>&3 | findstr /N /A:4E "^"

このようにして、エラー メッセージの前に赤の背景に黄色の行番号が表示されます。このメソッドは、いくつかのケースで直接使用できます。たとえば、プログラミング言語のソース プログラムのコンパイルでは、次のようになります。

anycompiler %1 2>&1 1>&3 | findstr /N /A:4E "^"
于 2012-04-21T17:03:40.513 に答える
1

行を括弧で囲みます

(
  REM How to do the stdout redirection from within the script itself here?
  ECHO is this redirected?
  ECHO yes it is
) >out.txt
于 2012-04-20T08:02:38.953 に答える