【WPF】Windowsのタスクスケジューラにタスクを登録する
おはようございます。
Windows のソフトであれば、
タスクスケジューラを使って何かしたいってこと、あると思います。
のでやってみました。
プログラムは前回のものを流用します。
スポンサーリンク
参照の追加
プログラムからタスクスケジューラを操作するためのライブラリを追加します。
パッケージ・エクスプローラーの「参照」を右クリックし「参照の追加」を選択します。
「COM」を選択し、「task」でフィルタリング、
「TaskScheduler 1.1 Type Library」にチェックをして「OK」ボタンをクリックします。
新規クラス作成
タスク登録用のクラスを追加します。
パッケージ・エクスプローラーでプロジェクトを右クリック、
「追加」>「クラス」を選択します。
名前に「TaskManager.cs」と入力して「追加」ボタンをクリックします。
TaskManager.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Reflection; usingTaskScheduler; namespaceWpfApp1 { classTaskManager { publicstaticvoidRegistTask() { ITaskService taskservice=null; try { taskservice=newTaskScheduler.TaskScheduler(); taskservice.Connect(null,null,null,null); ITaskFolder rootfolder=null; try { // アセンブリ情報取得 Assembly mainAssembly=Assembly.GetExecutingAssembly(); // ソフトウェア名 stringappName="-"; object[]AppNameArray=mainAssembly.GetCustomAttributes(typeof(AssemblyTitleAttribute),false); if((AppNameArray!=null)&& (AppNameArray.Length > 0)) { appName = ((AssemblyTitleAttribute)AppNameArray[0]).Title; } // 追加フォルダを指定する rootfolder=taskservice.GetFolder("\\"); Stringpath="\\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; /** 操作タブ */ // 実行フォルダ取得 StringappDir=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.UnauthorizedAccessExceptione) { throwe; } catch(System.Exceptione) { throwe; } } 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
1 2 | // タスクを登録 TaskManager.RegistTask(); |
実行するバッチの配置
下記のファイルを作成し、実行フォルダに配置します。
taskSample.bat
1 2 3 4 5 | @echo off echo %DATE% %TIME% タスク実行 > task.log exit/0 |
taskSample.vbs
1 2 3 4 5 6 7 8 9 | OptionExplicit DimintReturn Dimws Setws=CreateObject("Wscript.Shell") intReturn=ws.run("cmd /c taskSample.bat",0) WScript.Quit(intReturn) |
起動してみる
タスクスケジューラ―を起動すると、
無事にタスクが登録されているのが確認できました。
今回はここまで。
ではでは。
ディスカッション
ピンバック & トラックバック一覧
[…] https://www.doraxdora.com/blog/2017/10/07/post-2680/ […]