バッチでイベントログ出力する方法

このQ&Aのポイント
  • Windows2003でバッチファイルにてコマンドを実行し、エラーの場合はイベントログに出力する方法について解説します。
  • エラーメッセージを実際のコマンド実行時のエラーメッセージとして入れ込む方法についてアドバイスをお願いします。
  • エラーメッセージを複数行入れる方法がわからず、うまく実装できないので、助けてください。
回答を見る
  • ベストアンサー

バッチでイベントログ出力したい

バッチでイベントログ出力したい Windows2003でバッチファイルにてコマンドを実行し、エラーの場合は イベントログに出力したいと考えています。 ERRORLEVELを判定してエラーなら eventcreate /ID 100 /L system /SO Cmd /T ERROR /D "エラーメッセージ" のようにeventcreateコマンドを実行するようにしています。 この"エラーメッセージ"の部分を実際のコマンド実行時のエラーメッセージを 入れ込みたいのですが複数行入れる方法がないか教えてください。 コマンド 2> file.log のようにエラーを出力してそれをfor文で読み込んでいこうとしたのですが 変数に複数行入れることができず、上手くいきません。 何か良い方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

変数に複数行を入れる方法は正式にはないです。Windows2003Serverでは確認してませんが、XPでは下記で動きます。なお、for /f の仕様でファイル読み取り時に空行は無視されます。 注意としては、set MSG=!MSG!^ の次の行は空行(改行だけの行)にすることです。 また細かいテストはしてないので、読み取りファイル中に、CMDの特殊文字があると細工しないと駄目かも。 rem 変数の遅延展開をオンにする setlocal enabledelayedexpansion rem 1行目をMSGにセット for /f "delims=" %%A in (file.log) do set "MSG=%%A"&goto NEXT :NEXT rem 1行目を読み飛ばして2行目以降をサブルーチンに渡してつなぐ for /f "skip=1 delims=" %%A in (file.log) do call :SUBRTN "%%A" eventcreate /ID 100 /L system /SO Cmd /T ERROR /D "!MSG!" goto :EOF :SUBRTN rem MSGに改行をはさみながらセット set MSG=!MSG!^ %~1 goto :EOF

syun8079
質問者

お礼

ありがとうございます。 遅延展開というものを知りませんでした。 以下のバッチだと改行が入った変数にならないのですがどのような 違いがあるのでしょう。 ---------------------------------- @echo off rem 変数の遅延展開をオンにする setlocal enabledelayedexpansion for /f "tokens=*" %%A in (file.log) do ( set MSG=!MSG!^ %%A ) echo %MSG% ---------------------------------- バッチではなくコマンドプロンプト上で直接 set msg=aaa^ bbb というように実行してもaaaしか入っていません。 何か条件があるのでしょうか。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

>以下のバッチだと改行が入った変数にならないのですがどのような違いがあるのでしょう。 改行は入ってますが、echo %MSG% だと、echoの時に改行で文が切れます。 echo !MSG! としてください。

syun8079
質問者

お礼

ありがとうございます。 無事表示できました。

関連するQ&A

  • バッチファイルの変数引継ぎについて

    行き詰ってしまったので、どなたか知恵を授けていただければと思います。 現在、あるソフトウェアの「バッチモード」という機能を使用したバッチを作成していて、構文が > sdcmd batch ***.txt 上記のようにコマンドを羅列したテキストファイルを指定した実行コマンドになります。 sdcmd以降はソフト指定のコマンド以外は使用できず、変数設定ができない為に変数設定とログ保存を兼ねて上記コマンドを記載したバッチを > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > call aaa.bat %* >> aaa.log 2>&1 という内容の呼び出しバッチを作成たのですが、テキストファイル内の変数が代入されずに 実行されてしまいます。 cmd上から直接 > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > sdcmd batch ***.txt >> aaa.log 2>&1 を実行しても変数の代入は行われませんでした。 cmd上で変数とテキストファイル内のコマンドを手動実行すれば変数は解決できます。 設定した変数を、テキストファイル内の変数値に代入する方法はあるでしょうか。

  • Javacは、コマンドラインで実行する際、エラーナンバーを返しますか?

    現在、バッチファイルを作っていて、「Javacでコンパイルしてエラーがないと作成されたclassファイルを実行して、エラーがあったらバッチ処理を終了する」というバッチファイルを作成しようとおもっています。 バッチファイルでの条件分岐は if ERRORLEVEL構文で処理しようかと思っているんですが、そもそもjavacコマンドはERRORLEVEL変数に入れるようなエラーナンバーをコマンドプロンプトに返してくれるのかとおもいまして。。 分かる方は回答よろしくお願いします。

    • ベストアンサー
    • Java
  • バッチファイルでXCOPYコマンドが使えない

    XCOPYコマンドを使ったバッチファイルを作成しましたが、 バッチファイルの保存場所によって、 実行できたり、エラーになったりします。 エラーになる場合のメッセージは以下になります。 「'XCOPY' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 環境変数の設定は問題ありません。 ご教授ください。 よろしくお願いします。

  • WebOTXのコマンド実行結果ステータス取得方法

    WebOTXのdeployコマンドをバッチで実行しようとしています。 以下のコマンドに続けて、エラー処理を記述したいのですが、 dosコマンドのerrorlevelではエラーを取得できません。 cmd /c otxadmin deploy --user *** --password *** --force=true WARファイル WebOTXコマンドのエラーを拾う方法を教えてください。 よろしくお願いします。

  • マックでバッチファイル

    WindowsXP用バッチファイル(.CMD)を,MacOS-9の,単数の標準のバイナリー実行ファイルに,完全変換する方法を教えてください。  見た目が同じになれば,バッチをEXE(エグゼファイル)に変換後,それをマック用ファイルにする等,どんな方法でも結構です。  バッチで使用するコマンドは,@ECHO・TITLE・COLOR・SET(環境変数機能を利用した電卓として)・GOTO,です。  改めて,単数の,バイナリー形式の,実行ファイル,である事が条件です。お願いします!

  • バッチ・ログファイルへの出力

    <子シェル.bat>に以下のように正常/異常のEXITコードを出力させてます。 コマンド if %ERRORLEVEL% EQU 0 exit 0 if %ERRORLEVEL% NEQ 0 exit 100 <<親シェル.bat>>より上記子シェルをCallして正常/異常時にログファイルへメッセージを出力しようと思っています。 下記のように書いても正常/異常終了と関係なくログファイルへの出力はされませんでした。子シェルの実行自体はされてます。。 call 子シェル.bat IF %ERRORLEVEL% EQU 0 echo "OK" >>%logfile% 2>&1 IF %ERRORLEVEL% NEQ 0 echo "NG" >>%logfile% 2>&1 何が原因なのでしょうか・・・

  • PHP5の外部コマンド実行で、バッチファイルのエラーレベル値と標準出力(標準エラー?)の3つを取得できる関数はありますか?

    PHP5のWindows版を使っています。 外部コマンドを実行して、Windowsのバッチファイルのエラーレベル値と標準出力(標準エラー?)の3つを取得できる関数はありますか? test.cmdの中味 echo 標準出力内容です。 echo バッチファイルで標準エラー出力はわかりませんが exit /b 2 list ($ret, $stdout, $stderr) = 何か関数("test.cmd") echo $ret; // 2 echo $stdout; // 標準出力内容です。\nバッチファイルで標準エラー出力はわかりませんが echo $stderr; // ???? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ckw.exeでバッチファイル

    バッチファイル(.cmd/.bat)を直接ckwで実行したいのですが、いい方法はありますでしょうか。 cmd/batファイル(ckwを立ち上げるコマンドは書かない)をダブルクリック→ シースルーでckwが直接立ち上がる→ そこでバッチ処理をする という感じにしたいのです。 よろしくお願いします。

  • バッチファイル

    コマンドプロンプトから実行するコマンド 2つを、100回繰り返したいのですが、 バッチファイルで100回繰り返すにはどうしたらよいでしょうか? 単純にForで出来ると思っていたのですが、 dosのバッチファイルのforはちょっと違うみたいで、ほかの言語のように for(){繰り返したい処理} ということが出来ないみたいで、 しかも変数<100というのも出来ない? ようで(INで0 1 2 3・・・のように指定するのですね・・・?) 戸惑っています。 変数を使ってインデントして100で終了させようと思ったのですが、変数も使えない・・・??のですね。(使えるのでしょうか??) そこでWSHで一セット分のコマンドのバッチファイルを作ってWSHからそれを100回呼ぼうかと思ったのですが、いまいち方法がわかりません。 また、wshの中で直接dosコマンドが使えると最もよいのですが・・・。 詳しい方がいましたら教えていただけると幸いです。

  • バッチで削除したフォルダをイベントログに出力したい

    Windowsのバッチファイルで、定期的に特定の場所にあるフォルダを 削除したいと考えており、以下のような処理を想定しております。 ※OSはWindows Server 2008 R2です。 ---------------------------------------- @echo off rem 1,2,3で始まるフォルダを削除する for /D %%a in ("C:\test\1*") do rmdir /Q /S "%%a" for /D %%a in ("C:\test\2*") do rmdir /Q /S "%%a" for /D %%a in ("C:\test\3*") do rmdir /Q /S "%%a" ---------------------------------------- 上記のバッチでフォルダの削除自体はうまくいったのですが、 その際、削除したフォルダの情報をWindowsのイベントログに Informationとして出力したいと考えております。 イベントログの出力結果は全件まとめてでも一件ずつでも良いのですが、 どのように記載すれば実現できるでしょうか?

専門家に質問してみよう