tag:crieit.net,2005:https://crieit.net/tags/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%BC/feed 「タスクスケジューラー」の記事 - Crieit Crieitでタグ「タスクスケジューラー」に投稿された最近の記事 2019-07-04T10:27:15+09:00 https://crieit.net/tags/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%BC/feed tag:crieit.net,2005:PublicArticle/15201 2019-07-04T10:27:15+09:00 2019-07-04T10:27:15+09:00 https://crieit.net/posts/WPF-Windows 【WPF】Windowsのタスクスケジューラにタスクを登録する <p>Windows のソフトであれば、<br /> タスクスケジューラを使って何かしたいってこと、あると思います。</p> <p>のでやってみました。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/05/post-2364/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】Oracleに接続してデータ操作(追加、更新、削除)してみる</a></p> <h2 id="参照の追加"><a href="#%E5%8F%82%E7%85%A7%E3%81%AE%E8%BF%BD%E5%8A%A0">参照の追加</a></h2> <p>プログラムからタスクスケジューラを操作するためのライブラリを追加します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfTaskScheduler000.jpg" alt="参照の追加" /></p> <p>パッケージ・エクスプローラーの「参照」を右クリックし「参照の追加」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfTaskScheduler001.jpg" alt="ライブラリの追加" /></p> <p>「COM」を選択し、「task」でフィルタリング、<br /> 「TaskScheduler 1.1 Type Library」にチェックをして「OK」ボタンをクリックします。</p> <h2 id="新規クラス作成"><a href="#%E6%96%B0%E8%A6%8F%E3%82%AF%E3%83%A9%E3%82%B9%E4%BD%9C%E6%88%90">新規クラス作成</a></h2> <p>タスク登録用のクラスを追加します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfTaskScheduler002.jpg" alt="クラスの追加" /></p> <p>パッケージ・エクスプローラーでプロジェクトを右クリック、<br /> 「追加」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfTaskScheduler003.jpg" alt="クラス名の入力" /></p> <p>名前に「TaskManager.cs」と入力して「追加」ボタンをクリックします。</p> <p>TaskManager.cs</p> <pre><code>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) &amp;&amp; (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); } } } } </code></pre> <p>今回は単純に起動してから<br /> 60分(1時間)毎に繰り返し実行するタスクを登録するようにしました。</p> <h2 id="トリガーの種類"><a href="#%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E">トリガーの種類</a></h2> <p> </p> <p>インターフェース<br /> 説明</p> <p>IEventTrigger<br /> システムイベントが発生したタイミングで開始する</p> <p>ITimeTrigger<br /> 特定の日時に開始する</p> <p>IDailyTrigger<br /> 日次スケジュールに基づいてタスクを開始するタスクは毎日、1日おき、3日おきなど特定の時刻に開始されます。</p> <p>IWeeklyTrigger<br /> 週単位のスケジュールに基づいてタスクを開始する</p> <p>IMonthlyTrigger<br /> 毎月のスケジュールに基づいてタスクを開始する</p> <p>IMonthlyDOWTrigger<br /> 月曜日の曜日スケジュールでタスクを開始する</p> <p>IIdleTrigger<br /> コンピュータがアイドル状態になったときにタスクを開始する</p> <p>IRegistrationTrigger<br /> タスクが登録されたときにタスクを開始する</p> <p>IBootTrigger<br /> システムの起動時にタスクを開始する</p> <p>ILogonTrigger<br /> ユーザーがログオンしたときにタスクを開始する</p> <p>ISessionStateChangeTrigger<br /> コンソールの接続または切断、リモート接続または切断、またはワークステーションのロックまたはロック解除通知のタスクをトリガーします</p> <p>各トリガーの使用方法は長くなるので割愛させてください。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="起動時にタスク登録を実行する"><a href="#%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%BF%E3%82%B9%E3%82%AF%E7%99%BB%E9%8C%B2%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">起動時にタスク登録を実行する</a></h3> <p>コンストラクタに次の記述を追加します。</p> <p>MainWindow.xaml.cs</p> <pre><code>// タスクを登録 TaskManager.RegistTask(); </code></pre> <h2 id="実行するバッチの配置"><a href="#%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%90%E3%83%83%E3%83%81%E3%81%AE%E9%85%8D%E7%BD%AE">実行するバッチの配置</a></h2> <p>下記のファイルを作成し、実行フォルダに配置します。</p> <p>taskSample.bat</p> <pre><code> @echo off echo %DATE% %TIME% タスク実行 > task.log exit /0 </code></pre> <p>taskSample.vbs</p> <pre><code> Option Explicit Dim intReturn Dim ws Set ws = CreateObject("Wscript.Shell") intReturn = ws.run("cmd /c taskSample.bat", 0) WScript.Quit(intReturn) </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/10/WpfTaskScheduler004.jpg" alt="タスクスケジューラー" /></p> <p>タスクスケジューラ―を起動すると、無事にタスクが登録されているのが確認できました。</p> <p>今回はここまで。</p> <p>ではでは。</p> doraxdora