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)
タスクスケジューラ―を起動すると、無事にタスクが登録されているのが確認できました。
今回はここまで。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント