タスクは動かない。理由は16進数
Windowsのタスクスケジューラに、自動実行するbatファイルを仕込んでいました。ところが、これがいつまで経っても動かない。
原因はおそらく引数の設定か作業フォルダーの指定だったのですが、問題はそこではありません。タスクスケジューラを開いてエラーを確認しても、表示されるのは「0x…」から始まる16進数のコードだけなのです。
動かないこと自体は構いません。設定を間違えた私が悪い。ただ、何が悪いのかを伝える気が一切ない。
結局このbatファイルは、設定を少しずつ変えてはトリガーの時刻が来るのを待ち、結果を見てまた変える、という総当たりで直しました。原因は作業フォルダーまわりの設定でしたが、そこにたどり着くまでに何度も「時刻を待つ」を繰り返しています。16進数のコードが最初から意味を教えてくれていれば、この往復は要らなかった。そう思ってツールを作りました。
作ったもの: taskctl
kwrkb/taskctl — タスクスケジューラの診断ツールです。
やることはシンプルで、エラーコードを人間の言葉に翻訳し、次に何をすればいいかを示す。それだけです。
特徴は3つ。
- 読み取り専用: 設定は一切変更しません。診断して見せるだけなので、壊す心配なく実行できます
- 日本語・英語対応: 出力言語は環境から自動判定されます
- コマンドは2つだけ:
doctor(診断)とexplain(コードの翻訳)
使い方
インストールは、Releasesページからzipをダウンロードして展開するだけです。中身は taskctl.exe 1ファイルで、.NETランタイム等の追加インストールは不要です。
なお、taskctlは個人が配布している署名なしのexeです。そのため、ダウンロードして初回に実行すると、Windowsが「WindowsによってPCが保護されました」というSmartScreenの警告を表示します。これは署名証明書を付けていない配布ツール全般で起きる挙動で、taskctlに固有の問題ではありません。実行する場合は、警告画面の「詳細情報」→「実行」で進めます。中身が気になる方は、ソースがすべて公開されているのでリポジトリで確認してから実行してください。
doctor: タスク全体を診断する
taskctl doctor
登録されているタスクをまとめてスキャンし、問題のあるタスクだけ詳しい診断を表示します。
試しに私のPC(HPのOMEN 16)で走らせた結果がこちらです。
$ taskctl doctor
走査 68 タスク: error 0 / warning 12 / notice 106
=== \OmenInstallMonitor (Ready) ===
0x00000002 (2) [ERROR_FILE_NOT_FOUND]
(システムエラー)
これは何:
多くの場合 ERROR_FILE_NOT_FOUND(実行しようとしたファイルが見つからない)という
Windows システムエラーです。ただし LastTaskResult はプログラムの終了コードも
そのまま返すため、プログラムが独自に 2 を返した可能性も残ります。
考えられる原因:
操作のパスが存在しない、またはタスク実行時の文脈(別ユーザー
マップドライブ)から解決できない。
あるいは、起動したプログラム自身が終了コード 2 を返している。
次の一手 [調査]:
まずパスがタスクの実行ユーザー文脈で解決できるか確認する。
...
ちなみに出力に出てくる「LastTaskResult」は、タスクスケジューラの画面で「前回の実行結果」として表示されている、あの16進数コードのことです。
warning 12件の内訳を見ると、ほとんどがHP/OMEN系のプリインストールタスクでした。自分では何も設定していなくても、メーカー製のタスクが静かに失敗し続けている。doctorを走らせると、そういう状況まで一覧で可視化されます。
単なる「ファイルが見つからない」で終わらず、「このコードはプログラム独自の終了コードかもしれない」「タスクを実行するユーザーから見るとパスが解決できないケースがある」というハマりどころまで教えてくれるのがポイントです。冒頭のbatファイルを総当たりで直していた当時の私が一番ほしかったのは、まさにこの数行でした。
タスク名を指定すれば1つのタスクを深掘りすることもできます。
taskctl doctor MyBackup
explain: コードだけ翻訳する
「0x41303って何?」を調べたいだけなら、こちらです。
$ taskctl explain 0x41303
0x00041303 (267011) [SCHED_S_TASK_HAS_NOT_RUN]
(状態コード)
これは何:
まだ一度も実行されていない、という状態コード。失敗ではない。
次の一手 [判断]:
登録直後なら正常。実行されるはずなのに残るなら、トリガーと有効/無効を確認。
16進数(0x41303)でも10進数(267011)でも受け付けます。タスクスケジューラの画面に表示されている値を、そのまま貼り付けて大丈夫です。
やらないこと
taskctlは診断に特化しています。タスクの一覧表示や登録・有効化は、Windows標準のPowerShellコマンド(Get-ScheduledTask など)がすでにあるので、そちらを使ってください。
また、「この設定が悪そうです」と示すことはあっても、自動で直すことはしません。修正コマンドを表示するだけで、実行するかどうかは使う人が決める設計です。
まとめ
- タスクスケジューラのエラーは16進数コードで表示され、そこから先は自力で調べるしかない
- taskctlはコードを日本語に翻訳し、次にやることまで示す読み取り専用の診断ツール
- zipを展開して
taskctl doctorを実行するだけ
「タスクを設定したけど、ちゃんと動くのか不安」というときに、一度 doctor を走らせてみてください。
リポジトリはこちら: kwrkb/taskctl

コメント