ユーザーがキャラクターを作成し、ストーリー内のキャラクターから名前などで呼び出せる独自のアドベンチャーストーリーを選択するためにBATCHファイルを使用しようとしています。ストーリーを含むBATCHファイルが実行された後、またはすべてのECHOコマンドのログが作成され、後でプレイヤーが特定のプレイでスローした内容を読み取れるようにすると、1時間前に戻ってクールになりました。
ログファイルを次のように読みたい:
%date%%time%(ファイルが実行する長さのエコーコマンドによって表示されるすべてのテキスト)
残念ながら、方法を理解できるのは、日付と時刻だけを含むlogeファイルを作成することだけです。 ">> StoryLog.txt"と入力すると.txtファイルが作成され、そこに日付と時刻が表示されますが、バッチファイルをエコーされたtxtに表示したい後に、テキスト ">> StoryLog.txt"が表示されます。 「あなたはパス>>北に行く>> StoryLog.txt」が画面に表示されます。これは自然に機能しません。私は何をしますか?
この目的のために、私は以下を使用します:
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
日付/時刻はログファイルに書き込まれますが、画面には書き込まれないため、これは元の質問に対する最良の解決策になる可能性があります。ところで、一時ファイルを使用するたびに削除する必要はありません。バッチが終了する直前に一度だけ削除してください。
編集のために他の回答がかなり長くなったので、ここに新しい提案があります(あまり変更されていませんが、コードを非常に読みやすくしています):
@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
バッチスクリプトでそれを文字通り行うことはできませんが、関数を定義すると、次のように、関数が戻る前にログファイルに書き込む関数ブロック内のデータを出力できます。
@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
プレーヤーが何が起こるかを知るためにecho
するたびに、ログファイルにecho
を付けて、行の先頭に日付と時刻を追加することもできます:)私にとっては単純です。ただし、スクリプトがどのように見えるかはわかりません。