web-dev-qa-db-ja.com

スクリプトがタスクスケジューラで実行されている場合、スクリプトの出力をキャプチャするにはどうすればよいですか?

Windows Server 2008を使用して、Windowsタスクスケジューラで実行されているスクリプトの出力をキャプチャするにはどうすればよいですか?

私はかなり長いカスタム印刷バッチスクリプトをテストしていますが、デバッグのために、毎晩それからのすべての出力を確認したいと思います。

76
Mechaflash

これをタスクスケジューラのコマンド文字列として試してください。

cmd /c yourscript.cmd > logall.txt
70
user2744787

Stderr(ほとんどのエラーが発生する場所):

cmd /c yourscript.cmd > logall.txt 2>&1
49
Ivan

@ user2744787の答えを補足するために、スケジュールされたタスクの引数でcmdを使用する方法を示すスクリーンショットを次に示します。

enter image description here

38
kevinarpe

Yourscript.cmdを呼び出すdebug.cmdを使用できます

yourscript.cmd > logall.txt

yourscript.cmdの代わりにdebug.cmdをスケジュールします

37
rene

>>は、毎回上書きするのではなく、ログファイルを追加します。 2>&1は、ログファイルにもエラーを送信します。

cmd /c YourProgram.exe >> log.txt 2>&1
35

次のように出力する行のログファイルに書き込むことができます。

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

このように、すべてをトロールしたくない場合に出力するコマンドを選択できます。必要なものだけを取得します。 >は、指定されたファイルに出力します(存在しない場合はファイルを作成し、存在する場合は上書きします)。 >>は、指定されたファイルに追加します(ファイルが存在しない場合はファイルを作成し、存在する場合はコンテンツに追加します)。

9
Bali C

cmd.exeコマンドプロセッサを使用して、タイムスタンプ付きのファイル名を作成し、スケジュールされたタスクの出力を記録します

ここで他の人からの回答に基づいて作成するには、ファイル名に日付や時刻が埋め込まれた出力ファイルを作成することもできます。 cmd.exeコマンドプロセッサを使用して、これを行うことができます。

注:この手法は、内部Windows環境変数の文字列出力を取得し、文字位置に基づいてそれらをスライスします。このため、以下の例で提供される正確な値は、使用しているWindowsの地域に対して正しくない場合があります。また、一部の地域設定では、日付または時刻の一部のコンポーネントは、値が10未満の場合、作成されたファイル名にスペースを導入する場合があります。 nameは、構築しているコマンドラインを壊しません。実験して、状況に最適なものを見つけてください。

PowerShellcmd.exeよりも強力であることに注意してください。より強力な方法の1つは、さまざまなWindowsリージョンに対応できることです。しかし、この答えはPowerShellではなくcmd.exeを使用してこの問題を解決することなので、続行します。

cmd.exeを使用

次のように、内部環境変数%date%および%time%slicingすることにより、日付と時刻のさまざまなコンポーネントにアクセスできます。 、正確なスライス値はWindowsで設定された地域に依存します):

  • 年(4桁):%date:~10,4%
  • 月(2桁):%date:~4,2%
  • 日(2桁):%date:~7,2%
  • 時間(2桁):%time:~0,2%
  • 分(2桁):%time:~3,2%
  • 2番目(2桁):%time:~6,2%

この日付/時刻形式「Log_[yyyyMMdd]_[hhmmss].txt」を使用してログファイルに名前を付けたいとします。次を使用します。

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

これをテストするには、次のコマンドラインを実行します。

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

まとめて、スクリプトからstdoutstderrの両方を現在の日付と時刻で指定されたログファイルにリダイレクトするには、コマンドラインとして次を使用します。

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

ファイル名を引用符で囲んで、日付または時刻コンポーネントがスペース文字を導入する可能性があるインスタンスを処理することに注意してください。

私の場合、現在の日付/時刻が2017年5月10日午前9時5分34秒である場合、上記のコマンドラインは以下を生成します。

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
8
STLDev