一、概述
Windows電腦提供了任務計划程序,對於需要定時執行的任務,可以利用任務計划程序來協助執行。在任務計划程序的幫助下,可以創建要由Windows運行的各種自動化任務。計划任務具體的特性和屬性可以參考官網。另外在Linux和Unix系統中也有類似的工具Corn。
二、手動創建任務計划程序
1、啟動任務計划服務
- 方式一:開始菜單->運行,輸入services.msc 打開服務窗口,亦可以通過控制面板->管理工具->服務,手動對Task Scheduler服務進行啟動。
- 方式二:通過命令形式啟用服務
2、停止任務計划程序服務
- 方式一:打開服務窗口,右鍵關閉服務
- 方式二:通過命令方式
3、查看Task Scheduler狀態
4、打開任務計划程序
- 方式一:控制面板-管理工具-任務計划程序
- 方式二:windows + R鍵,打開運行,並輸入“taskschd.msc”
5、創建任務計划程序
- 在管理界面,點擊任務計划程序庫,如圖:
三、代碼創建任務計划程序
1、將基本操作封裝為公共庫
using System; using Microsoft.Win32.TaskScheduler; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Linq; namespace SchedulerTask { /// <summary> /// windows系統里面的計划任務 /// </summary> public class SchedulerTaskBus { /// <summary> /// 創建一個以指定日期時間為觸發條件 /// </summary> /// <param name="taskName">任務名稱</param> /// <param name="taskDescription">任務描述</param> /// <param name="startBoundary">指定日期時間</param> /// <param name="path">應用程序路徑</param> /// <param name="arguments">應用程序參數</param> /// <param name="subFolderName">文件夾名稱</param> public static void CreateOnceRunTask(string subFolderName, string taskName, string taskDescription, string path, DateTime startBoundary, string arguments) { using (TimeTrigger trigger = new TimeTrigger(startBoundary)) { using (ExecAction action = new ExecAction(path, arguments, null)) { CreateTask(subFolderName, taskName, taskDescription, trigger, action); } } } /// <summary> /// 創建一個計划任務 /// </summary> /// <param name="taskName">任務名稱</param> /// <param name="taskDescription">任務描述</param> /// <param name="trigger">觸發條件</param> /// <param name="action">執行任務</param> /// <param name="subFolderName">文件夾名稱</param> public static void CreateTask(string subFolderName, string taskName, string taskDescription, Trigger trigger, Microsoft.Win32.TaskScheduler.Action action) { using (TaskService ts = new TaskService()) { using (TaskDefinition td = ts.NewTask()) { td.RegistrationInfo.Description = taskDescription; //http://stackoverflow.com/questions/8170236/how-to-set-run-only-if-logged-in-and-run-as-with-taskscheduler-in-c //td.Principal.UserId = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //td.Principal.LogonType = TaskLogonType.InteractiveToken; td.Principal.RunLevel = TaskRunLevel.Highest; td.Triggers.Add(trigger); td.Actions.Add(action); TaskFolder folder = ts.RootFolder; if (!string.IsNullOrWhiteSpace(subFolderName)) { if (!folder.SubFolders.Exists(subFolderName)) { folder = folder.CreateFolder(subFolderName); } else { folder = folder.SubFolders[subFolderName]; } } folder.RegisterTaskDefinition(taskName, td); folder.Dispose(); folder = null; } } } /// <summary> /// 刪除某一個子文件夾 /// </summary> /// <param name="folderName">絕對路徑</param> public static void DeleteSubFolders(string folderName = @"\Test") { // Get the service on the local machine using (TaskService taskService = new TaskService()) { using (TaskFolder folder = taskService.GetFolder(folderName)) { if (folder.Tasks.Count > 0) { throw new InvalidOperationException("TASKS_EXIST"); } if (folder.SubFolders.Count > 0) { throw new InvalidOperationException("SUB_FOLDERS_EXIST"); } using (TaskFolder folderParent = taskService.GetFolder(folder.Path.Replace(@"\" + folder.Name, ""))) { folderParent.DeleteFolder(folder.Name); } } } } /// <summary> /// 獲取某一個文件夾下面的所有子文件夾 /// </summary> /// <param name="folderName">傳null表示根文件夾</param> /// <returns></returns> public static IEnumerable<TaskFolder> GetAllSubFolder(string folderName = @"\Test") { using (TaskService taskService = new TaskService()) { TaskFolder folder = taskService.RootFolder; if (!string.IsNullOrWhiteSpace(folderName)) { folder = taskService.GetFolder(folderName); } foreach (TaskFolder subFolder in folder.SubFolders) { yield return subFolder; } } } /// <summary> /// 刪除某一個文件夾下面的某一個任務 /// </summary> /// <param name="taskName">要刪除的任務名稱</param> /// <param name="folderName">傳null表示根文件夾</param> public static void DeleteTask(string folderName, string taskName) { using (TaskService taskService = new TaskService()) { TaskFolder folder = taskService.RootFolder; // 判斷文件夾和任務是否存在 if (folder.SubFolders.Exists(folderName) && folder.SubFolders[folderName].Tasks.Exists(taskName)) { folder.SubFolders[folderName].DeleteTask(taskName); } folder.Dispose(); folder = null; } } /// <summary> /// 獲取所有任務 /// </summary> /// <returns></returns> public static IEnumerable<Task> GetAllTask() { using (TaskService taskService = new TaskService()) { return taskService.AllTasks; } } /// <summary> /// 獲取某一個文件夾下面的所有任務 /// </summary> /// <param name="folderName">傳null表示根文件夾</param> /// <returns></returns> public static List<Task> GetAllTask(string folderName = @"\Test") { using (TaskService taskService = new TaskService()) { TaskFolder folder = taskService.RootFolder; if (!string.IsNullOrWhiteSpace(folderName) && folder.SubFolders.Exists(folderName)) { folder = taskService.GetFolder(folderName); return folder.AllTasks.ToList(); } return new List<Task>(0); } } /// <summary> /// 查找符合條件的所有Task /// </summary> /// <param name="regex"></param> /// <param name="searchAllFolders"></param> /// <returns></returns> public static IEnumerable<Task> GetAllTask(Regex regex, bool searchAllFolders = true) { using (TaskService taskService = new TaskService()) { return taskService.FindAllTasks(regex, searchAllFolders); } } /// <summary> /// 查找符合條件的Task /// </summary> /// <param name="taskName"></param> /// <param name="searchAllFolders"></param> /// <returns></returns> public static Task GetTask(string taskName, bool searchAllFolders = true) { using (TaskService taskService = new TaskService()) { return taskService.FindTask(taskName, searchAllFolders); } } public static bool IsExist(string folderName,string taskName) { using (TaskService taskService = new TaskService()) { TaskFolder folder = taskService.RootFolder; // 判斷文件夾和任務是否存在 return folder.SubFolders.Exists(folderName) && folder.SubFolders[folderName].Tasks.Exists(taskName); } } } }
2、調用公共庫
string taskName = $"測試"; string taskDescription = $"測試計划任務"; string arguments = $"arg1={xx}&arg2={xx}";
SchedulerTaskBus.CreateOnceRunTask("Test", taskName, taskDescription, $"{appName}.exe", DateTime.Now.AddDays(1), arguments);