【WPF】Windowsのタスクスケジューラにタスクを登録する
おはようございます。
Windows のソフトであれば、
タスクスケジューラを使って何かしたいってこと、あると思います。
のでやってみました。
プログラムは前回のものを流用します。
スポンサーリンク
参照の追加
プログラムからタスクスケジューラを操作するためのライブラリを追加します。
パッケージ・エクスプローラーの「参照」を右クリックし「参照の追加」を選択します。
「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)
起動してみる
タスクスケジューラ―を起動すると、
無事にタスクが登録されているのが確認できました。
今回はここまで。
ではでは。
ディスカッション
ピンバック & トラックバック一覧
[…] https://www.doraxdora.com/blog/2017/10/07/post-2680/ […]