ある処理を毎日同じ時間に実行したい。
このような要望の為にWindowsに用意されているのがタスクスケジューラ。
しかしこのタスクスケジューラからPythonのプログラムを実行しようとすると、実行結果が (0x1)
というエラーになってしまう。
そこで今回はエラーにならない実行方法を共有する。
(0x1)エラーって何?
(0x1)
はファイルやプログラムが見つからない時に発生するエラー。
「お客様が指定されたプログラムを実行しようとしましたが、そもそも見つけられませんでした。」
というもの。
大体のユーザーは手動で実行確認したものを自動化したくてタスクスケジューラを設定しているのに、「見つけられませんでした」では憤慨モノである。
0x1: 該当するデータが存在しません。
タスクの設定手順
何故エラーになるの?
下の例のような空白を含むパス、他にも括弧を含むパスがあるとWindowsは認識できずにエラーになってしまう模様。
引数の指定についても同様。
C:\Program Files\Python36\python.exe
参考
* Windows10におけるタスク実行が0x1でエラーとなる - マイクロソフト コミュニティ
* Scheduled Task Error 0x1
* タスク スケジューラ で、空白を含む引数を指定すると (0x1) で終了してしまいます (CmdletBindingを使用した場合)
解決方法は?
3通りの対処方法がある。
プログラムやファイルのパスを見直す
原因に対する正当な対処方法。
空白や括弧を含むパスや引数が無いかを調べてダブルクオートやシングルクオートで囲っていく。
なかなか地道な作業な上に1つでも見落とすと解決しないのが辛い。
バッチファイルから実行する
Python等の実行コマンドをバッチ(.bat)ファイルに記述して、タスクスケジューラからはバッチファイルを起動する。
プログラムの引数もバッチの中に書いてしまうので、手動実行で動作する事を確認すればあとはタスクスケジューラにバッチファイルを登録するだけで良いので楽。
バッチファイルには以下のように書く。
REM バッチファイルのディレクトリに移動 cd %~d0%~p0 python hoge.py > %fname%
Windows使うのをやめる
プログラムの自動実行とかサーバー的な使い方をするなら、そもそも Wondows
ではなく Linux
を使う方が良い。
Linuxを使えばタスクスケジューラのようなものに悩まされなくて済む。
まとめ
- (0x1)が発生するのはファイルやプログラムが見つからないから
- プログラムが見つからないのはパスや引数に空白や括弧が含まれてるから
- 解決するにはパスを見直すかバッチ化するかWindows使うのをやめるか