起動すると特定のポートでサービスを開始するWindowsアプリケーションがあるのだが、これをある時間帯だけ稼働させたい、なんかいい方法は無いだろうか? という質問を受けたので、ちょっと方法を検討してみた。
定期的に作業させたい場合は、タスクスケジューラを使って開始時間と継続時間を設定すればいいのだが、そのアプリケーションは終了時に確認を求めるタイプなので、この方法ではうまく終了してくれない。
そこで思いついた方法は次の2つ
(1)起動しているアプリをリモートコントロールして終了させる
(2)利用ポートを遮断してアプリは起動しっぱなしとする
今回は、(1)の方法でうまく行きそうな目処が立ったので、こちらの方法を紹介します。
1.アプリケーションの起動はタスクスケジューラを普通に使って行う
2.終了については、下記のような WSH を作成してタスクスケジューラに登録する
Set objShell = WScript.CreateObject("WScript.Shell")
if objShell.AppActivate("Application Title") then
WScript.Sleep 100
objShell.SendKeys "%{F4}"
WScript.Sleep 100
objShell.SendKeys "{Y}"
end if
* AppActivate の引数は、終了したいアプリケーションのタイトルバーの内容を入れる
* SendKeys は、アプリケーションに応じて変更(この場合は、Alt+F4 後、確認ダイアログに Y で応えている)
これでOKです。久しぶりに WSH なんて使いましたよ。
▽12/27追記
ログオンした状態で放っておく場合はこの方法でOKだが、そうでない場合はダメっぽい。隠しフラグの TASK_FLAG_INTERACTIVE でなんとかなるかと思ったがこれもダメ。今のところマシン自体を再起動させて道連れ終了させる他にいい手がなさそう。
▽12/27追記
SendKeysによるキーコード送信はログオフ中は無効になるようなので、この方法は使えないようです。別の方法でプロセスを終了させるようにしてみました。ただ、強制終了に近いと思いますので、アプリケーションによっては不具合が出てしまうかもしれません。
for each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery ("select * from Win32_Process where Name='application.exe'")
Process.terminate
Next
※ application.exe のところは終了させたいアプリケーションに入れまえます
[PC・ネット] タスクスケジューラで起動したアプリを終了する方法 : してログ
0 件のコメント