2016/04/06

コマンドラインで・・・

・・・Windowsの[タスクスケジューラ]にタスクを登録するTipsは、GUIを用いる場合同様に多い。


■ しかし、
コマンドラインのみで
指定したアプリケーションが起動されたらスケジュールを開始し、指定時間だけ遅延させて 指定プログラムを実行させる。
と云った定義を行うケースで、適合する内容は皆無に近かった。
■ ソコで、
ここでは 試行した例で ざっくり紹介するコトに。
◆ トリガー後、5min遅延して開始。 Schtasks /create /f /it /sc onevent /rl highest /tn "PSO2yomiD5" /tr "'C:\Program Files (Free)\StreamingSet\PSO2yomi\PSO2yomi.exe'" /ec Application /mo *[System[Provider[@Name='pso2.exe']]] /delay 0005:00 ◆ 遅延指定ナシ。 Schtasks /create /f /it /sc onevent /rl highest /tn "PSO2yomi" /tr "'C:\Program Files (Free)\StreamingSet\PSO2yomi\PSO2yomi.exe'" /ec Application /mo *[System[Provider[@Name='pso2.exe']]]
pso2.exe が 起動されたら、5min後に PSO2yomiを開始する と云うスケジュールを登録する為の指定を模索した結果だ。 タスクスケジューラへの登録は、概ねこれで完結出来ている。 しかし、pso2.exeが "起動をイベントとして返さない" 為、予定していた用途としては動作しなかったが・・・
◆ Schtasksコマンドへの パラメータを詳細を解説すると・・・
/create - タスク作成。

/f - 既存エラーを返さず強制上書き。

/it - ユーザーがログオンしている場合のみ実行。

/sc onevent - トリガーで[イベント]を選択。

/rl highest - 最上位の特権でタスクを実行。

/tn "PSO2yomiD5" - スケジュールの名前。
  "AnyFolderName\PSO2yomiD5" のような形式で 階層化指定も可能。

/tr "'C:\Program Files (Free)\StreamingSet\PSO2yomi\PSO2yomi.exe'"
  実行させたいアプリケーションのフルパスを指定する。

/ec Application - トリガー[イベント時]-[基本]-[ログ]-[アプリケーション]を選択した状態に。

/mo *[System[Provider[@Name='pso2.exe']]]
  @Name=に続く 'pso2.exe' の部分で、スケジュールのトリガーとなるアプリケーションのプロセス名を指定。
  ココに指定したアプリケーションからの 起動イベントが検出されたら、スケジュールを開始する。

/delay 0005:00 - この記述で 5min・・・ 同様の書式で、スケジュールがトリガーされてから、
         [実行を指定されているアプリケーションを開始するまでの時間] を指定。 
         /delayは省略可能で、その場合はトリガー後、即実行扱いとなる。
コンなカンジ。 このような記述で、[タスクスケジューラ]に 登録されるスケジュールの設定画面のうち、[全般] [トリガー] [操作] 各タブは 設定制御出来る。 だが、[条件] と [設定] については、数多あるTipsサイトの情報を併読したとしても定義不能な項目もあり、該当パラメーターを調査中。
■ 尚・・・
上述の通り、この方法で登録したスケジュールは多くのアプリケーションで機能しない。

◆ 原因は、
殆どの一般アプリケーションは、Windowsに対して "イベントを返さない" 構造であるコトに尽きる。

そもそも、/sc onevent 指定、"トリガーとして[イベント]を利用する" 登録でのキモは、
任意に指定したアプリケーションが イベントを返す・・・ イベントログに対して "起動などを報告する(書き込む)" かどうかである。

因って、イベントログに該当する変化のナイ殆どのアプリケーションでは、ソレを検出して動作する /sc onevent を用いても、
トリガーとして機能するコトはナイ と云うワケだ。
★ しかし、このタイプのタスクスケジューラへ登録は、UACナシでの起動を実現したい場合には有用である。
schtasks.exeは、スケジュール登録だけを行うコマンドではナイ、登録済みスケジュールを実行させる用途でも用いる。

以下のような内容でショートカットを作成すると、
schtasks /Run /TN PSO2yomi
クリックするだけで スケジュールが 前述のコマンドラインから設定した通り [最高権限]で実行される。 これでUACの確認画面は出ない。
しかし、一瞬プロンプトが表示されてしまう・・・ schtasksを実行している画面だ。

これをショートカットからの起動で非表示にしたい場合は、
ショートカットのプロパティで [実行時の大きさ] で [最小化] を 選択しておくと良い。
◆ 当然VBScriptからの利用でも、
・・・UAC非表示で実行可能だ。
Dim My, ShApp
Set My = WScript
With My
    Set ShApp = .CreateObject("Shell.Application")
End With

Const schtasks = "C:\Windows\System32\schtasks.exe"

ShApp.ShellExecute schtasks, "/Run /TN PSO2yomi", "", "", 0

Set ShApp = Nothing
My.Quit
このように .ShellExecute の 最終引数で 0 [ウィンドウ非表示]を指定しているのだが、 コレは schtasks.exe の実行を非表示にするモノであり、その後に起動されるアプリケーションは、 元々のウィンドウ状態で起動すると云うのが、この用法でのポイントだろう。
◆ 但し、
schtasks.exe /Run を用いた場合は、"トリガーで起動していない" 為、
トリガー後に対する遅延起動指定である /delay で設定された待機は実施されない点に注意が必要だ。

従って、対象のアプリケーション起動まで 任意の待機時間を設定したいのであれば、
Dim My, ShApp
Set My = WScript
With My
    Set ShApp = .CreateObject("Shell.Application")
End With

Const schtasks = "C:\Windows\System32\schtasks.exe"

My.Sleep 300000 ' 5min
ShApp.ShellExecute schtasks, "/Run /TN PSO2yomi", "", "", 0

Set ShApp = Nothing
My.Quit
VBScriptで sleep を事前に配置するなどして、対処するしかない。
■ もし、
◆ フリーアプリケーションを提供されていて、UAC起因でお困りなら、以下のように、
.batファイル (.ShellExecuteでなら パラメータで カレントディレクトリを別途指定して) に、
Schtasks /create /f /it /sc onevent /rl highest /tn "任意のプロダクツ名称\任意のスケジュール名称" /tr "'%~d0%~p0任意のアプリケーションのファイル名'" /ec Application /mo *[System[Provider[@Name='dummy.exe']]]
%~d0%~p0 は、実行した.batファイルのルートフォルダを著す文字列として扱われる。
・・・ないし、 実行させたいアプリケーションへパラメータを付与したい場合は、
Schtasks /create /f /it /sc onevent /rl highest /tn "任意のプロダクツ名称\任意のスケジュール名称" /tr "'%~d0%~p0任意のアプリケーションのファイル名' アプリケーションへのパラメータ" /ec Application /mo *[System[Provider[@Name='dummy.exe']]]
・・・このようにSchtasksを記述しておいて、
実行したいファイルと同じ場所に設置、
このバッチファイルを実行すると スケジュールが適宜登録される。 ◆ このスケジュールを
・・・起動する 以下のような ショートカットを作成しておき、
schtasks /Run /TN "任意のプロダクツ名称\任意のスケジュール名称"
デスクトップにレイアウトするよう インストールアーカイブを構成すれば良いだろう。
★ この方法なら、
ドコにアプリケーションをレイアウトしても、
スケジューラの値さえ正しければ、デスクトップショートカットの内容は固定で良いのも利点だ。

0 件のコメント:

コメントを投稿