この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
ども。あいしんくいっと(@ithinkitnet)です。
ithinkit
以前、Windowsタスクスケジューラの基本的な使い方を紹介しました。
Windowsタスクスケジューラの基本的な使い方について
タスク作成ウィザードに沿ってタスクスケジューラを設定したとしても「設定したタスクが正常に実行されない」なんてことは良くある話です。
なので、今回はタスクスケジューラが実行されない時に確認したいポイントを6つほど挙げておきたいと思います。
クリック可能な目次
タスクスケジューラが動かないときに確認したい項目6選
実行対象のバッチ/スクリプトパスに間違いは無いか
「実行させたいバッチやスクリプトのパス指定を間違える」これは設定したタスクが正常に動作しない時によくあるイージーミスです。
タスクスケジューラで指定した場所にバッチ/スクリプトがなかったり、実行ファイル名が間違えていたり。
最初に疑うべきは「バッチ/スクリプトへのパス指定に間違いが無いか」です。
例えば、実行ファイル名が間違っていた場合、タスクスケジューラの履歴上は正常終了と出力されるものの、実際には実行されずにエラー「0x1」が出力されます。実行ファイルのパス指定が間違っていた場合も同様。
Windowsのタスクスケジューラで履歴が表示されない!そんな時は履歴の有効化をしよう。
「ユーザがログオンしている時のみ実行する」になっていないか
次にありがちなのが、タスクスケジューラの設定で「ユーザがログオンしている時のみ実行する」になっている場合。
この場合、ユーザがログインしてないとタスクが実行されず、ユーザがログアウトしてしまうとタスクが実行されない。
そのため、「ユーザがログオンしているかどうかにかかわらず実行する」に必ずチェックを入れておく。
「最上位の特権で実行する」にチェックが入っているか
「最上位の特権で実行する」にチェックが入っているかどうか。このチェックも忘れがち。
「最上位の特権で実行する」にチェックが入っていないと、実行権限がないユーザ指定されたり、バッチ/スクリプトの内容によってタスク実行されなかったりする可能性があります。
なので、「最上位の特権で実行する」にチェックが入っていることを必ず確認しましょう。
バッチ実行ユーザーに実行権限が付与されているか確認してください。必要であれば、Administratorsグループに参加させるなど対応が必要です。
PowerShellで作成したスクリプトの指定に気を付けろ
タスクスケジューラを使ってPowerShellで作成したスクリプトを実行する場合、スクリプトを直接指定すると何故かnotepadが起動します。
なので、「PowerShellの本体を指定して、引数としてスクリプトを設定する」必要があります。
直接、PowerShellで指定したスクリプトを指定してタスクを起動すると、
何故かnotepad.exeが起動してしまう・・・。う~ん、馬鹿なのかw
(原因としては”プログラムの関連付け”がどう、とからしいが・・・)
なので、PowerShellの本体を指定し、引数としてスクリプトを設定する必要があります。
PowerShell本体(実行モジュール)のパスは以下。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
パスに半角カッコ”()”が入っていないか
指定するパス及び、ファイル名に”()” (半角カッコ)が入っていると何故かタスク実行されないという現象が。。。
これは驚きでしたね。たぶんタスクスケジューラのバグなんでしょうけど。
例えば、ファイル名に半角カッコが入ったスクリプトを実行しようとすると、
履歴上は正常終了と出力されるものの、実際にはタスクが実行されずにエラー「0x1」が出力されます。
ちなみに”()” (全角カッコ)だと、
正常にタスク実行されます。
ログオン/ログオフスクリプトの設定については以下の記事を参考にしてください。
Windows Server 2012 R2でログオン/ログオフスクリプト設定(ついでにログオンスクリプト遅延問題も解決)
「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックは外しておこう
念のため、「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックは外しておくと良いかも。
実行間隔は5分は空けよう
タスク実行をテストする時、現在時刻よりも1分後とか、2分後とか、やりがちです。
ithinkit
タスクスケジューラの実行間隔は少なくとも3分は空けないと正常に実行されません。余裕をもって5分後とかにすると良いと思います。
実行日が過去日付になっていないか
実行日が過去日になっていた場合、当たり前ですがタスクは実行されません。
念のため、確認してみてください。
OSの時間がズレてないか
時間通りに動かない場合、OSの時刻合ってるか確認してください。
NTP時刻同期とかしてないと時刻ズレが発生していて、時間通りに動かないといった初歩的なミスも考えられます。
バッチに「pause」や「sleep」はないか
バッチやPowerShell作成時に「pause」や「sleep」を使うことがあるのですが、それらのコマンドが入ったまま、タスクスケジューラで動かそうとすると当然止まります。「pause」や「sleep」が含まれていないか確認し、あれば取り除いてください。
では、最後にタスクスケジューラが動かない時に確認したい項目をまとめておきます。
- 実行対象のバッチ/スクリプトパスに間違いは無いか
- ユーザがログオンしている時のみ実行する」になっていないか
- 「最上位の特権で実行する」にチェックが入っているか
- PowerShellで作成したスクリプトの指定に気を付けろ
- パスに半角カッコ”()”が入っていないか
- 「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックは外しておこう
- 実行間隔は5分は空けよう
- OS時刻にズレがないか
- 実行日が過去日付になっていないか
- バッチに「pause」や「sleep」はないか
RoboCopyバッチをタスクスケジューラで起動した場合、正常に動いても実行結果が「ファンクションが間違っています。(0x80070001)」となる謎の事象に遭遇。
気持ち悪いけど、タスクスケジューラの仕様なのだろうか・・・。
Windowsを使うのであれば、タスクスケジューラを使う機会も多いと思います。タスクが実行されない時の確認ポイントをしっかりと把握しておくことでトラブルシューティングが捗りますので覚えておいてください。
ithinkit
タスクスケジューラのインポート/エクスポートはこちら。
Windowsのタスクスケジューラにおける一括エクスポート/インポートについて
以上、あいしんくいっとでした。
こんにちは。
タスクスケジューラに指定して動かないからバクだと騒ぐ前に一度コマンドプロンプトに貼り付けて実行してみて正しいパス指定をしているかどうか確認することをおすすめします。下記の2つはタスクスケジューラの問題ではなく、パスの指定方法が間違っていたため発生したものです。
PowerShellで指定したスクリプトを指定してタスクを起動してnotepad.exeが起動したのは、実行したPCで、「.ps1」の関連付けがnotepad.exeとなっているからです。スクリプトをダブルクリックしたときの挙動と同じです。もし、スクリプトを指定して実行したのであれば、「.ps1」の関連付けをPowerShellに変更すればよいです。
パスに半角括弧が入ると実行できないのは半角括弧が引数における特殊文字だからです。同様にアンドとパイプ(|)も使えません。これらの文字を引数として使いたい場合は^を文字の前につけてエスケープする必要があります。「無題^(1^).ps1」と設定します。
コメントありがとうございます。
テンパった時はそれらの事が冷静に判断出来ず、判断に困るので忘れないように備忘的な記事にした次第です。。
参考になる情報を色々と教えて下さり、非常に参考になりました^^