実行するとキューに入るWindowsタスクの謎を解けその知識、ホントに正しい? Windowsにまつわる都市伝説(209)

先日、Windowsに最初から登録されている、あるシステムタスク(タスクスケジューラのタスク)の状態を確認して、準備完了状態になっている場合は即時実行するようなPowerShellスクリプトを作成しました。しかし、このスクリプトを実行しても、タスクは期待通りに「実行中」にはならず、「キューに挿入済み」になってしまうのです。今回は、その原因と対策などを解説します。

» 2022年05月11日 05時00分 公開
[山市良テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Windowsにまつわる都市伝説」のインデックス

Windowsにまつわる都市伝説

イベントビューアやタスクスケジューラはイライラするからコマンドで解消

 Windowsの初期バージョンからの機能と下位互換性を維持するため、応答性が損なわれていると筆者が感じるツールに「イベントビューア」(Eventvwr.msc)と「タスクスケジューラ」(taskschd.msc)があります。

 「アプリケーション」「セキュリティ」「システム」「Internet Explorer」といった、少数のログへのアクセスを提供していた「Windows XP」のイベントビューアは非常に高速でした。「Windows 10」や「Windows 11」では、ログが完全に表示されるまでに数十秒かかることがあります。タスクスケジューラも開いたときに、「応答なし」になるのをよく目にします。

 イベントログを確認する場合は、「WMIC NTEVENT」コマンド、「Get-EventLog」コマンドレット(アプリケーションとサービスログに対応していない、間違った説明を表示することがある、などで非推奨)、「WEVTUTIL」ツール、「Get-WinEvent」コマンドレットなど、コマンドラインから実行する方が高速であり、細かいフィルタリングも可能なので、定形的な作業に利用しています。詳しくは、筆者の過去の連載(本連載を含む)などをまとめた拙著『Windowsトラブル解決 コマンド&テクニック集』(日経BP社、2018年)などいかがでしょう。

 タスクスケジューラの代替としては、「Schtasks」コマンドやPowerShellの「ScheduledTasks」モジュールの「Get-ScheduledTask」「Start-ScheduledTask」などのコマンドレットが利用できます。

「Schetasks /Run」や「Start-ScheduledTask」ではすぐに実行されないタスクがある

 PowerShellスクリプトの作成が頭にあったので、迷わずにGet-ScheduledTaskコマンドレットでタスクの状態(State)を取得し、その状態に応じて、Start-ScheduledTaskコマンドレットを実行するようにコードを書いてみました。

 コマンドラインで確認してから、スクリプトを仕上げていこうと思っていたのですが、Start-ScheduledTaskでタスクの実行を開始しても、期待通りに状態が「実行中(Running)」にならずに、「キューに挿入済み(Queued)」になってしまうタスクが存在することに気が付きました。Start-ScheduledTaskを再実行しても状況は変わりません(画面1)。

画面1 画面1 Start-ScheduledTaskでタスクの実行を開始しても「実行中」ではなく、「キューに挿入済み」になってしまう

 タスクスケジューラで問題のタスクを右クリックして「実行する」をクリックすると、すぐに実行中になります。それと同じことがコマンドラインからできないのです。なお、「キューに挿入済み(Queued)」の状態になったタスクは、しばらく放置しておくと、「実行中」になるようです。

 タスクの履歴機能を有効化して確認すると、イベントID「325」の「起動要求がキューに入れられました」と、イベントID「110」の「ユーザーにトリガーされるタスク」から先がありません(画面2)。

画面2 画面2 Start-ScheduledTaskでタスクを開始しても「キューに挿入済み」状態になってしまうタスクの履歴(イベントID「129」より新しい履歴は右クリックして「実行する」を選択した後のもの)

原因は「条件」オプションにあり!

 試しに、「cmd.exe」を開始するだけの単純な基本タスクを作成して、同じように実行してみました。すると、筆者が作成したタスクは、期待通りにすぐに実行されました(画面3)。

画面3 画面3 「cmd.exe」を実行するだけの簡単なタスクを作成してStart-ScheduledTaskで開始すると、すぐに「実行中」になる

 タスクの設定を眺めて、いろいろ試してみた結果、どうやら「次の間アイドル状態の場合のみタスクを開始する」がチェックされていると、Start-ScheduledTaskで開始しても「キューに挿入済み」状態になることが分かりました(画面4)。電源に接続されていないノートPCやモバイルデバイスの場合は、「コンピューターをAC電源で使用している場合のみタスクを開始する」がチェックされている場合も同様の現象が発生します。

画面4 画面4 Start-ScheduledTaskは、「次の間アイドル状態の場合のみタスクを開始する」や「コンピューターをAC電源で使用している場合のみタスクを開始する」の条件の影響を受ける

 ノートPCやモバイルデバイスの場合、使用方法によっては(例えば、利用中はバッテリーでのみ動かし、電源を完全にオフにして夜間に充電するなど)、「コンピューターをAC電源で使用している場合のみタスクを開始する」が既定で有効になっているタスクは、長期間、重要なタスクが全く実行されないということがあるかもしれないので、気を付けた方がよいかもしれません。

回避策は「Schtasks /Run」コマンドの「/I」オプション

 同様の現象は、「Schtasks /Run」コマンドで開始する場合も発生します。ただし、「/I」オプションを追加してあげることで、すぐに実行させることができました(画面5)。「/I」オプションの「I」は“Immediately”に由来し、オプションの説明には「すべての制約を無視し、タスクをすぐに実行します」とあります。そして、Start-ScheduledTaskには、これに相当するオプションは用意されていません。

画面5 画面5 「Schtasks /Run /I /TN <タスク名>」を使用すると、タスクの「条件」設定に関係なく、タスクをすぐに開始できる

 というわけで、作成中のPowerShellスクリプトは、Start-ScheduledTaskではなく、「Schtasks /Run /I」コマンドに置き換えて、無事完成しました(画面6)。コードの詳細や用途については、ご想像にお任せします。

画面6 画面6 完成したPowerShellスクリプト。「runtask.ps1 <タスク名> <タスクパス>」で実行することで、タスクが「無効」でない場合に、実行して完了まで待つ

 タスクスケジューラについては、以下のように、筆者の連載でも問題や謎について何度か取り上げてきました。

 本連載第144回で紹介した「毎週9:00(日本時間)」にスケジューリングしたタスクが前日と当日の2回実行されてしまうという信じ難いバグの件ですが、その後、問題が修正されたという情報は得ていません。

 記事を書いたときに作成した再現テスト用のタスクをそのまま放置していることに気が付き、先日確認してみました。少なくとも「2021年4月」までは現象が再現していましたが(Windows 10 バージョン21H2に更新済み)、その後1年間は発生していませんでした(画面7)。ひっそりと修正されたのでしょうか?

画面7 画面7 再現テストのために1年以上前に仕込んでおいた「毎週金曜9:00」のタスク。2021年4月15日と16日を最後に問題は再現していない

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP 2009 to 2022(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。