任務計划程序Task Scheduler


一、概述

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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM