【WPF】Windowsのタスクスケジューラにタスクを登録する

公開日:2019-07-04
最終更新:2019-07-04
※この記事は外部サイト(https://www.doraxdora.com/blog/2017/10/07/...)からのクロス投稿です

Windows のソフトであれば、
タスクスケジューラを使って何かしたいってこと、あると思います。

のでやってみました。

プログラムは前回のものを流用します。
【WPF】Oracleに接続してデータ操作(追加、更新、削除)してみる

参照の追加

プログラムからタスクスケジューラを操作するためのライブラリを追加します。

パッケージ・エクスプローラーの「参照」を右クリックし「参照の追加」を選択します。

「COM」を選択し、「task」でフィルタリング、
「TaskScheduler 1.1 Type Library」にチェックをして「OK」ボタンをクリックします。

新規クラス作成

タスク登録用のクラスを追加します。

パッケージ・エクスプローラーでプロジェクトを右クリック、
「追加」>「クラス」を選択します。

名前に「TaskManager.cs」と入力して「追加」ボタンをクリックします。

TaskManager.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  

using System.Reflection;  
using TaskScheduler;  

namespace WpfApp1  
{  
    class TaskManager  
    {  

        public static void RegistTask()  
        {  

            ITaskService taskservice = null;  
            try  
            {  
                taskservice = new TaskScheduler.TaskScheduler();  
                taskservice.Connect(null, null, null, null);  
                ITaskFolder rootfolder = null;  
                try  
                {  

                    // アセンブリ情報取得  
                    Assembly mainAssembly = Assembly.GetExecutingAssembly();  

                    // ソフトウェア名  
                    string appName = "-";  
                    object[] AppNameArray = mainAssembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false);  
                    if ((AppNameArray != null) && (AppNameArray.Length > 0))  
                    {  
                        appName = ((AssemblyTitleAttribute)AppNameArray[0]).Title;  
                    }  

                    // 追加フォルダを指定する  
                    rootfolder = taskservice.GetFolder("\\");  
                    String path = "\\DORADORA\\" + appName + "(自動実行タスク)";  

                    // 新規登録用のタスク定義  
                    ITaskDefinition taskDefinition = taskservice.NewTask(0);  

                    // RegistrationInfoプロパティ  
                    IRegistrationInfo registrationInfo = taskDefinition.RegistrationInfo;  

                    // Actionsプロパティ  
                    IActionCollection actionCollection = taskDefinition.Actions;  
                    IExecAction execAction = (IExecAction)actionCollection.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);  

                    // Triggersプロパティ  
                    ITriggerCollection triggerCollection = taskDefinition.Triggers;  
                    ITimeTrigger timeTrigger = (ITimeTrigger)triggerCollection.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);  

                    // Settingsプロパティ  
                    ITaskSettings taskSettings = taskDefinition.Settings;  

                    /** 全般タブ */  

                    // 作成者  
                    registrationInfo.Author = "DORADORA";  

                    // 説明  
                    registrationInfo.Description = "タスク登録のサンプル";  

                    // 主要な設定  
                    IPrincipal principal = taskDefinition.Principal;  

                    // タスクの実行時に使うユーザアカウント  
                    principal.UserId = Environment.UserDomainName + "\\" + Environment.UserName;  

                    // ユーザがログオンしているかどうかにかかわらず実行する(パスワードを保存しない(チェックあり))  
                    principal.LogonType = _TASK_LOGON_TYPE.TASK_LOGON_S4U;  

                    // 最上位特権で実行する  
                    //principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;  

                    // 表示しない  
                    taskSettings.Hidden = true;  

                    // 優先度  
                    taskSettings.Priority = 6;  

                    /** トリガタブ */  

                    // 開始  
                    timeTrigger.StartBoundary = "2017-10-02T00:00:00";  

                    // 繰り返し間隔  
                    timeTrigger.Repetition.Interval = "PT1H";  

                    // 有効  
                    timeTrigger.Enabled = true;  

                    /** 操作タブ */  

                    // 実行フォルダ取得  
                    String appDir = System.IO.Path.GetDirectoryName(mainAssembly.Location);  

                    // プログラム/スクリプト  
                    execAction.Path = appDir + "\\taskSample.vbs";  

                    // 引数の追加(オプション)  
                    //execAction.Arguments = "引数";  

                    // 開始(オプション)  
                    execAction.WorkingDirectory = appDir;  

                    try  
                    {  
                        rootfolder.RegisterTaskDefinition(path,  
                                                            taskDefinition,  
                                                            (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE,  
                                                            null,  
                                                            null,  
                                                            _TASK_LOGON_TYPE.TASK_LOGON_NONE,  
                                                            null);  
                    }  
                    catch (System.UnauthorizedAccessException e)  
                    {  
                        throw e;  
                    }  
                    catch (System.Exception e)  
                    {  
                        throw e;  
                    }  
                }  
                finally  
                {  
                    if (rootfolder != null)  
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(rootfolder);  
                }  
            }  
            finally  
            {  
                if (taskservice != null)  
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(taskservice);  
            }  

        }  
    }  
}  

今回は単純に起動してから
60分(1時間)毎に繰り返し実行するタスクを登録するようにしました。

トリガーの種類

インターフェース 説明
IEventTrigger システムイベントが発生したタイミングで開始する
ITimeTrigger 特定の日時に開始する
IDailyTrigger 日次スケジュールに基づいてタスクを開始するタスクは毎日、1日おき、3日おきなど特定の時刻に開始されます。
IWeeklyTrigger 週単位のスケジュールに基づいてタスクを開始する
IMonthlyTrigger 毎月のスケジュールに基づいてタスクを開始する
IMonthlyDOWTrigger 月曜日の曜日スケジュールでタスクを開始する
IIdleTrigger コンピュータがアイドル状態になったときにタスクを開始する
IRegistrationTrigger タスクが登録されたときにタスクを開始する
IBootTrigger システムの起動時にタスクを開始する
ILogonTrigger ユーザーがログオンしたときにタスクを開始する
ISessionStateChangeTrigger コンソールの接続または切断、リモート接続または切断、またはワークステーションのロックまたはロック解除通知のタスクをトリガーします

各トリガーの使用方法は長くなるので割愛させてください。

プログラム修正

起動時にタスク登録を実行する

コンストラクタに次の記述を追加します。

MainWindow.xaml.cs

// タスクを登録  
TaskManager.RegistTask();  

実行するバッチの配置

下記のファイルを作成し、実行フォルダに配置します。

taskSample.bat

    @echo off  

    echo %DATE% %TIME% タスク実行 > task.log  

    exit /0  

taskSample.vbs

    Option Explicit  

    Dim intReturn  
    Dim ws  
    Set ws = CreateObject("Wscript.Shell")   

    intReturn = ws.run("cmd /c taskSample.bat", 0)  

    WScript.Quit(intReturn)   

起動してみる

タスクスケジューラ―を起動すると、無事にタスクが登録されているのが確認できました。

今回はここまで。

ではでは。

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする