2015年11月6日金曜日

PC Batch と Raise Event と Schedule Task

実は、TechNet の Forum で、既に、削除されてしまった 質問がありました。
メインプロセスがサブを起動して終了してしまい、このサブの終了を捉えて、バッチを実行したい と。
確か、意訳すれば、その様な 内容であったかと。
実は次の様な シナリオ を考えていました。
Batch と Raise Event と Schedule Task の組み合わせです。


バッチ。  そうです。  昔は良くお世話になっていましたが、最近、ご無沙汰です。
ですから、 目を瞑って書くと、とんでもないエラーの山が築かれてしまいます。
そんなレベルの者が書く内容ですので、 その旨、お含み置き下さい。

前提条件の おさらい です。
メインプロセスがサブを起動して終了してしまい、このサブの終了を捉えて、バッチを実行したい
考えていた シナリオ です。
CommandPrompt の tasklist によって稼働中のイメージ(プロセス)を取得
これを 無限ループ で監視し 該当プロセスが消滅したら イベントを 挙げる
事前に イベントをトリガーとするタスクを登録して置く
イベント発生を受け タスクスケジュラーから 目的の作業を実施

さて、このシナリオを実際に書いて見たのが 以下のバッチ達 です。
Visual Basic の方が 最近では 出番がずっと多いので、内容が不安ですが、何とか動いています。.

例示では、 mspaint.exe(ペイント) が既に起動されていて、これの終了を受けて、cmd.exe で文字表示 と言う内容で。

つまり、UI (User Interface) の実行ファイル名(イメージ名)が 事前に 把握されている ものとします。
これが不明なケースでは、 Microsoft SysInternals の Process Explorer 等で調査し 特定する事 になるでしょう。



さてさて、先ずは、 イベントを挙げる迄のバッチです。  バッチ名: TestLoopIsExistExe.bat

@echo off

rem        Absolute File Path
set myWorkFile ="C:¥Users¥UserName¥Documents¥BatchFiles¥IsExistsExeWork.txt"

:Loop

tasklist | find "mspaint.exe" > myWorkFile
        rem type myWorkFile
find "mspaint.exe" myWorkFile
if errorlevel 1 goto End
if errorlevel 0 goto Next

:Next
    echo Loop
timeout /t 10
goto Loop

:End
    echo Match
rem Event Create
rem Notice  Please Check "myUiClosed" Is Not Existed On EventViewer

eventcreate /L APPLICATION /T INFORMATION /SO myUiClosed /ID 999 /D "myUiApp execution was closed"

pause


これで、イベントビュアーで確認可能なイベントが生成されました。
  アプリケーション の myUiClosed と言う項目です。  種類は 情報 で、 /D 以下が概要です。


このイベントを受けるバッチも作ります。  バッチ名: TestLoopIsEnded.bat
ここでは、単に、 起動するだけ。  :) 。.

@echo off

rem OnEventBatch

echo OnEvent!!!

pause


最後に、( GUI / タスク スケジューラ で ) このイベントをトリガーにふたつ目のバッチを起動させるタスクをスケジュールして おしまい。


因みに、このバッチも書いたのですが、 何か不足しているらしく まとも には動きません。  知識不足!。.
/EC System の部分を タスク絡みに 直して、 /MO の部分を弄って、 まとも にしてあげて下さい.

@echo off
rem Create TaskScedule


set myWorkBatch ="'C:¥Users¥UserName¥Documents¥BatchFiles¥TestLoopIsEnded.bat'"

schtasks /Create /TN myUiClosedEventLog /EC System /TR C:¥Users¥UserName¥Documents¥BatchFiles¥TestLoopIsEnded.bat /SC ONEVENT /MO *[Application/myUiClosed/EventID=999]

rem     Notice /EC System = Root = \

pause


では、実行して見て下さい。
おっと、 その前に、(この例では) mspaint.exe (ペイント) を立ち上げて置くのをお忘れなく。
ペイントを終了させると ふたつ目のバッチが立ち上がれば OK !。

後は、目的の内容に合わせて、バッチを加工して下さい。


ふぅ、  久しぶりに、バッチを書くと、 疲れます。



10 件のコメント:

  1. 付け足させてください。

    メインプロセスはサブプロセスを起動するだけで、タスクマネージャーにも現れず、
    起動しているプログラムのメインウィンドウを閉じても、
    動いているプロセスのすべてが終了せず、常駐し続ける状態でした。
    そしてこの状態のせいでPCに不具合が現れたわけです。

    これに困って質問したわけですが……

    あと、件のコメントは削除してもらって結構ですよ

    返信削除
    返信
    1. orso903 さま 拝見しました。

      つまり、UI (User Interface) の実行ファイル名(イメージ名)が 事前に 把握されている ものとします。
      これが不明なケースでは、 Microsoft SysInternals の Process Explorer 等で調査し 特定する事 になるでしょう。

      と本文にも書いたのですが、 メインではなく、ユーザーインターフェースの実行ファイル名を見付ける事です。
      そうすれば対応が可能になる筈です。  確か、Taskkill で問題がなかったのでしたよね。

      削除
  2. このコメントは投稿者によって削除されました。

    返信削除
  3. はい、taskkillは問題無いです。

    Process Explorer でプロセスの動きを改めて見てみたのですが、
    アプリ起動と同時にcsrss.exeの下に複数のconhost.exeが起動していました。

    これがウィンドウの実体はではないかと思われます。

    しかし、ウィンドウを閉じただけではやはりプロセスに変化は一切見られず。
    (複数のconhost.exeを含め、アプリに関連するプロセスを終了させると、ようやくウィンドウも閉じて終了できました。しかし、これなら同梱の関連プロセスを全て終了させる実行ファイルを使ったほうが早いわけですし)

    完全に手詰まりです。

    このアプリはSkypeのような「終了しないアプリ」なのではないかという気がします。
    (しかし、終了してもらわないと困るわけですが)

    返信削除
    返信
    1. orso903 さま 確認です。 ユーザーがウィンドウを閉じて、消滅する .exe はありませんか?。

      イベントが記録されたり ログが書かれる事があれば、それをトリガーにタスクを起動させられます。
      投稿の内容は、消滅する .exe を捉え、イベントを発生させる事でした。
      何か捉えられれば、何とかなるのですが ... 。  やはり、皆さんが仰っていた様に無理なのでしょうかね。

      削除
    2. orso903 さま 追加情報です。

      最悪、 休止移行失敗で発生するイベントを捉え、実行する手が ... 。 (こりゃぁ、最終手段)
        参考: Kernel-Power、イベント ID : 42 が休止移行 なので、その後にあると思います。
                (Kernel-Power イベントID:41 かな? イベントビュアーで見て見て下さい) 
      その場合、休止移行も含めたバッチにする必要もありますね。

      削除
    3. 目を皿のようにして観察しているのですが、消滅する.exeはないですね。
      それから、Kernel-Powerも見てみましたが、エラーの痕跡すら無し。

      powercfgで指定してもダメ、プロンプトで手動で休止状態にしようとすれば
      「記憶域が足りない」とのエラー。
      いずれもイベントビューアーじゃエラーの理由もわからず。

      完全にお手上げです。

      削除
    4. それから気になっていることがもう一点。

      質問しても誰も触れませんでしたが、以前はこのような現象は発生しなかったのに、
      9月か10月あたり(もう少し前かもしれませんが)のWindows Updateを適応したところ
      発生するようになったと思われること。

      アップデート前から何らかの不具合がすでにPCに潜んでいて、それがアップデートで顕著化したのか、
      それともアップデート自体に何らかの不具合と思われるものがあるのか。
      (PCは問題発覚後、何度かリカバリーを施し、
      最終的に問題が全くなかった今年3月の状態にリカバリーしてます)

      確かめようにも、アップデートを削除して一つづつ入れなおしてなんてのは現実的ではないし。

      ただ、ここにヒントがあるのは間違いないと思うんですけどね。

      削除
    5. orso903 さま 拝見しました。

      やはり簡単には行かないですね。
      休止の移行時に挙動不安定 でしたよね。
      ウィンドウを閉じる もしくは 休止移行 のイベントさえ捉えられれば終わりなのですが。
      エラーでなくても特定が出来てイベント発行に持って行ける PC 内の変化を見付ければ良いのですが。
      アプリのイベントログ書き込みとか .exe 間の通信とか イベントログの情報とか ... 余計、難しくなりますね、これじゃぁ。
      うちの環境では、該当ソフトもないし 休止も失敗しないので、 これ以上は ... 。

      さて、WinUpdate 絡みの件ですが。  確か、書きましたよね、私。  分らないと。
      只、言えるのは、 お使いのソフトが Microsoft が想定推奨していない方法で動いているものであろう と言う点。
      WinUpdate には恐らく不具合は無い筈です。
      一部の欧米圏のソフトが日本語の FolderName を上手に扱えないのはご存知ですか。
      それと類似した問題が内包されているのでしょう。
      そう言うものだと 諦めて 上手に付き合うのが ソフトを使う コツ でもあったりします。
        仮に、WinUpdate でどのモジュールに問題があるかを突き止めても 対応は取れないです、 開発サイドなら兎も角。
        そのソフト専用マシンなら該当 KB を外す手もありますが、リスクは大きい。

      私なら、(以下は読み飛ばして下さい) 休止を止めます。 Shutdown にしますね、きっと。

      削除
  4. 以下 別投稿のコメントより移動  2015/11/06

    ------------------------------------------------

    orso9032015年11月1日 23:11

    フォーラムではお世話になりました。orso903です
    もういいです。疲れました。

    いちいち粘着され誹謗中傷を受けてまで解決しようと思えるほど私は強くありません。
    それにまともな議論も望めそうにありません

    トピックスもアカウントも削除してもらうつもりです。
    トピックが消えてコメントが届かない事を考え、場違いですがこちらにもコメントさせてもらいました。

    お世話になりました、ありがとうございました。
    失礼しました。さようなら。

    ------------------------------------------------

    ShiroYuki_Mot2015年11月2日 0:22

    orso903 さま 拝見しました。

    先ずは、お疲れさま。  大変でしたね。
    また、ご丁寧に、コメントを戴き、感謝です。
    ただ、複数で質問する場合は 関連 URL を明記なさると宜しいですよ。  そうすれば、より正確的確な返信が貰えます。

    さて、Batch は詳しくないので、 方法論のアイデアだけ追加で書き込んであります。
    ご覧戴ければ幸いです。

    ------------------------------------------------

    orso9032015年11月2日 3:20

    言い訳に聞こえるかもしれませんが、
    まず、自分の中ではそれぞれが独立した、別の質問のつもりでした。

    それにその辺りは詳しくないので知りませんでした。
    なのでリンクはつけませんでした。

    度々失礼しました。

    ------------------------------------------------

    ShiroYuki_Mot2015年11月2日 22:49

    orso903 さま ご報告です。

    こちらの投稿と関係ないコメントですので、近日中に 別投稿を作成し そちらにコメント全て移動します。
    匿名扱いのコメントになりますので、事前に、ご案内します。
    投稿 URL は次の予定です。
     http://shiroyuki-mot-says.blogspot.com/2015/11/pc-batch-raise-event-schedule-event.html

    -------------------------------------------------

    以上 別投稿のコメントより移動  2015/11/06

    返信削除