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) && (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