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


95

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

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


2
時々、これは機能しない、すなわちログファイルが生成されない。これにつながる可能性のあるシナリオの1つは、Windowsがまだ実行中であると誤って考えるため、タスクがまったく開始されなかった場合です。タスクの履歴(タスクプロパティの履歴タブ-情報が表示されるまでに数秒かかる場合があります)を調べることで追跡できます
Daniel

回答:


83

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

cmd /c yourscript.cmd > logall.txt

2
素晴らしい、ラッパーは不要、優れた動作、タスクスケジューラーによってトリガーされるbat / cmdから呼び出される子PowerShellスクリプトからのログ出力もありがとうございます。
Jonesome Reinstate Monica 2016

8
さらに、cmd /c "path with spaces/command.cmd > file.txt"スペースがある場合に使用します。イワンの答えも引用符の内部に入ります。2>&1
Dinei

3
鉱山を機能させるには二重引用符を使用する必要があります:stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
私はそれが5年になったことを知っていますが、これを、タスクを実行する最小限の方法であるために受け入れられた答えに変更します。
メカフラッシュ

タスクを実行すると、コマンドウィンドウが表示されます。それを防ぐ方法は?
クリス

57

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

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

56

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

ログファイルへのスケジュールされたタスクcmd出力

プログラム/スクリプト: cmd

引数を追加します。 /c run_with_default_port.bat > IMQuantWebServices.log


5
スケジュールされたタスクを介してサービスを開始しているようです。これがバックグラウンドで永続的に実行されるサービスである場合は、代わりにNSSMを確認してください。任意のコマンドをWindowsサービスとして実行し、障害発生後の再起動などを処理します
leemes

43

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

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

39

yourscript.cmdを呼び出すdebug.cmdを持つことができます

yourscript.cmd > logall.txt

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


10

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

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

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

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

使用する cmd.exe

次のように、内部環境変数とをスライスすることで、日付と時刻のさまざまなコンポーネントにアクセスできます(ここでも、正確なスライス値はWindowsで構成されている領域によって異なります)。%date%%time%

  • 年(4桁): %date:~10,4%
  • 月(2桁): %date:~4,2%
  • 日(2桁): %date:~7,2%
  • 時間(2桁): %time:~0,2%
  • 分(2桁): %time:~3,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年10月5日9:05:34 AMである場合、上記のコマンドラインは次のようになります。

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

10時間未満の時間には先行ゼロはありません
。//

9

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

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

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


1

プログラムを実行し、stdoutとstderrをタイムスタンプ付きのファイルに書き込む方法の例:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

重要な部分は、後ろ全体を二重引用符で囲みcmd /c、内部では通常どおり二重引用符を使用することです。また、日付はロケールに依存することに注意してください。この例はUSロケールを使用して動作します。


0

このスニペットは、wmic.exeを使用して日付文字列を作成します。ロケール設定によって壊されることはありません

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.