タスクスケジューラにpythonを登録する方法(引数付実行)

学習履歴

■はじめに

Windows のタスクスケジューラに python ファイルを登録する際、設定につまずいたので
備忘を残しておく。

■環境

Windows 8 で実行

■実行ファイル / スクリプト格納先

・python.exe (python の実行ファイル)
C:\Program Files\Continuum\anaconda3

・echo.py(今回作成する python ファイル)
C:\Program Files\python\Lesson\request_conf

■タスクスケジューラの登録

1. 基本タスクの作成

タスクスケジューラを開いたら、「タスクスケジューラ ライブラリ」→ 「基本タスクの作成」からタスクを作成する。

1.png

2. タスク名の設定

echo_test と設定する。
※タスク名は、任意

2.png

3. タスク トリガー

タスク トリガーは不要だが選択しないと先に進めないので、適当につけておく。
※後ほど削除する

3.png

4.png

4. 操作を設定

「プログラムの開始(T)」を選択する。

5.png

5. 実行ファイルの選択

タスクスケジューラで実行したい python ファイルを選択する。

・プログラム/スクリプト(P)
→python.exe の格納場所

・引数の追加(オプション)(A):
→echo.py (python ファイル)を指定
※外部から引数を受け取りたい場合は、$(Arg0)$(Arg1)$(Arg2)... みたいに指定する

・開始(オプション)(T):
→echo.py の格納場所を指定

6.png

6. タスク作成完了

完了ボタンを押下する。

7.png

8. トリガー削除

作成したタスクをダブルクリック→設定したトリガーを「削除(D)」で削除→「OK」ボタンで確定。

8.png

■python ファイルの作成

タスクスケジューラで実行する python ファイルを作成する。
この時、外部から引数を受け取りたいので、sys モジュールを使う。

echo.py
import sys

# echo.py の格納場所 test.txt を出力する
with open('test.txt', 'w') as file:
     #外部から受け取った引数の値を test.txt に書き込む
     file.write(sys.argv[1])

■vbs ファイルを作成

外部からタスクスケジュールを引数付で実行するために vbs ファイルを作成する。
※タスクスケジューラを起動できれば、vbs でなくてもいい

calltask.vbs
' タスクスケジューラのサービスを取得し、接続
Set TaskService=CreateObject("Schedule.Service")
TaskService.Connect
'フォルダを指定①
Set TaskFolder=TaskService.GetFolder("\")
'echo_test を指定②
Set RegisteredTask=TaskFolder.GetTask("echo_test")
'引数付で実行③
RegisteredTask.Run "Echo"

①と②の指定先は、作成した echo_test タスクのプロパティの「全般」タブから
確認できる。

9.png

③は、渡したい引数を指定する。

後は、この vbs スクリプトを C ドライブ辺りに保存して直接実行すれば、
echo.py と同じフォルダに test.txt が生成される。

10.png

「Echo」 は問題なく出力されているようだ。

■ vbs ファイルの変更

最終的にはこういう動きをさせたい。

<理想>
1. ssh で vbs を起動
2. vbs でタスクスケジューラ起動
3. タスクスケジューラで python ファイルを実行

なぜ ssh で実行したいかというと、selenium で、勤怠入力を自動で行うスクリプトを作成していて、
リモートサーバ上にそのスクリプトを置いているからだ。

しかし、デスクトップ上で直接実行すると問題なかったのだが、ssh コマンド経由で
実行すると何故かエラーになった。

他に何か方法がないかと思って、タスクスケジューラから実行してみたらエラーにならず
正常終了した。

その為、ssh 経由でタスクスケジューラを起動させたいのだが、ssh から直接タスクスケジューラを呼び出すことが難しいので、間に vbs をかませることにしたという経緯だ。

先ほど作成した vbs ファイルをコマンドラインから引数付で実行できるように改造する。

calltask.vbs
' 引数の値を受けとる
dim arg0

arg0 = WScript.Arguments(0)

' タスクスケジューラのサービスを取得し、接続
Set TaskService=CreateObject("Schedule.Service")
TaskService.Connect
'フォルダを指定
Set TaskFolder=TaskService.GetFolder("\")
'echo_test を指定
Set RegisteredTask=TaskFolder.GetTask("echo_test")
'引数付で実行
RegisteredTask.Run arg0

C ドライブ直下にこのスクリプトを保存して、コマンドラインから実行してみると想定通りに動いてくれた。

11.png

12.png

ここまで来れば、ssh コマンドで実行できると思うので、後で試してみようと思う。

■まとめ

タスクスケジューラに登録した python ファイルを引数付で実行できるようになった。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.