web-dev-qa-db-ja.com

すべてのECHOコマンドのログをBATCHファイルに作成するにはどうすればよいですか?

ユーザーがキャラクターを作成し、ストーリー内のキャラクターから名前などで呼び出せる独自のアドベンチャーストーリーを選択するためにBATCHファイルを使用しようとしています。ストーリーを含むBATCHファイルが実行された後、またはすべてのECHOコマンドのログが作成され、後でプレイヤーが特定のプレイでスローした内容を読み取れるようにすると、1時間前に戻ってクールになりました。

ログファイルを次のように読みたい:

%date%%time%(ファイルが実行する長さのエコーコマンドによって表示されるすべてのテキスト)

残念ながら、方法を理解できるのは、日付と時刻だけを含むlogeファイルを作成することだけです。 ">> StoryLog.txt"と入力すると.txtファイルが作成され、そこに日付と時刻が表示されますが、バッチファイルをエコーされたtxtに表示したい後に、テキスト ">> StoryLog.txt"が表示されます。 「あなたはパス>>北に行く>> StoryLog.txt」が画面に表示されます。これは自然に機能しません。私は何をしますか?

11
Sean McLain

この目的のために、私は以下を使用します:

set LogFile=somepath\logfile.txt
set logg=^> _^&type _^&type _^>^>%LogFile%
echo this goes to screen AND file! %logg%

これは少しトリッキーです。その行を4つの部分に分解してみましょう。

set logg=      ^> _          ^&type _           ^&type _^>^>%LogFile%

アイデアは、行を一時ファイル(_という名前)に出力し(2番目の部分)、そのファイルの内容を画面に入力し(3番目の部分)、ログファイルに入力します(4番目の部分)。

これらすべてを変数(最初の部分)に置くと、そのモンスターの文字列をすべての行に入力する必要がなくなります。 (これが>および&^でエスケープされる理由です)

使用するたびに

echo whatever %logg%

画面に表示され、%logfile%に書き込みます

これも機能することに注意してください:

 %logg% echo whatever

編集 djangofan:また、関数でそれを行うことができます:

@ECHO off
:: do not enable delayed expansion since it will break this method
SETLOCAL ENABLEEXTENSIONS
SET LogFile=logfile.out
SET Logg=^> tmp.out^&^& type tmp.out^&^&type tmp.out^>^>%LogFile%

CALL :logit "This is my message!"
CALL :logit "Hear my thunder?"

GOTO :end
:logit
ECHO %~1 %Logg%
DEL /Q tmp.out
EXIT /B 0
:end
pause

編集ステファン:CALLを使用する場合、%logg%は過剰になります。その場合、私は単に使用します:

:logit
echo %~1
echo %date%,%time% - %~1 >>logfile
exit /b 0

日付/時刻はログファイルに書き込まれますが、画面には書き込まれないため、これは元の質問に対する最良の解決策になる可能性があります。ところで、一時ファイルを使用するたびに削除する必要はありません。バッチが終了する直前に一度だけ削除してください。

7
Stephan

編集のために他の回答がかなり長くなったので、ここに新しい提案があります(あまり変更されていませんが、コードを非常に読みやすくしています):

@ECHO off
SET LogFile=logfile.out
set "say=call :logit "

%say% "This is my message!"
%say% "Hear my thunder?"

GOTO :end
:logit
ECHO %~1 
echo %date% %time% - %~1 >>%logfile%
EXIT /B 0
:end
3
Stephan

バッチスクリプトでそれを文字通り行うことはできませんが、関数を定義すると、次のように、関数が戻る前にログファイルに書き込む関数ブロック内のデータを出力できます。

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
echo. 2>outfile.log

CALL :functionPerson "Jon Doe" jump
GOTO :END
:functionPerson fullname action
  ECHO fullname is ^"%~1^"
  ECHO action is %2
  ECHO %1 performs action %2>> outfile.log
EXIT /B 0
:END
pause
0
djangofan

プレーヤーが何が起こるかを知るためにechoするたびに、ログファイルにechoを付けて、行の先頭に日付と時刻を追加することもできます:)私にとっては単純です。ただし、スクリプトがどのように見えるかはわかりません。

0
callisto