首页 > 系统相关 >c# 4.8 实现Windows 定时任务计划(Task Scheduler)

c# 4.8 实现Windows 定时任务计划(Task Scheduler)

时间:2024-02-28 17:01:29浏览次数:30  
标签:case Task return get c# 4.8 StartBoundary public taskSchedulerConfig

分享一个我自己写的 Windows 定时任务计划(Task Scheduler) 动态创建代码,没做太多封装,留个实现笔记

首先封装一个简单配置项的类

public class TaskSchedulerConfig
{
    /// <summary>
    /// 引用程序路径
    /// </summary>
    public string ApplicationPath { get; set; }
    /// <summary>
    /// 引用程序参数
    /// </summary>
    //public string ApplicationParameter { get; set; }
    /// <summary>
    /// 任务名称
    /// </summary>
    public string TaskName { get; set; }
    /// <summary>
    /// 任务说明
    /// </summary>
    public string TaskDescription { get; set; }
    /// <summary>
    /// 任务执行周期 0 每日执行 1 每周执行 2 每月执行
    /// </summary>
    public int TaskExecutionCycle { get; set; }
    /// <summary>
    /// 开始执行时间范围 yyyy/MM/dd HH:mm:ss
    /// </summary>
    public DateTime StartBoundary { get; set; }
    /// <summary>
    /// 每月的第几号执行
    /// </summary>
    public int DaysOfMonth { get; set; }
    /// <summary>
    /// 每周的周几执行
    /// </summary>
    public int DaysOfWeek { get; set; }
}

         /// <summary>
         /// 根据数字1-7来设置周一 - 周日
         /// </summary>
         /// <param name="num"></param>
         /// <returns></returns>
         static DaysOfTheWeek GetDaysOfTheWeek(int num)
         {
             switch (num)
             {
                 case 1:
                     return DaysOfTheWeek.Monday;
                 case 2:
                     return DaysOfTheWeek.Tuesday;
                 case 3:
                     return DaysOfTheWeek.Wednesday;
                 case 4:
                     return DaysOfTheWeek.Thursday;
                 case 5:
                     return DaysOfTheWeek.Friday;
                 case 6:
                     return DaysOfTheWeek.Saturday;
                 case 7:
                     return DaysOfTheWeek.Sunday;
                 default:
                     throw new ArgumentException("无效的数字。请提供1到7之间的数字。");
             }
         }
         /// <summary>
         /// 限定每月只能在1-28号之间执行任务
         /// </summary>
         /// <param name="num"></param>
         /// <returns></returns>
         static int GetDaysOfMonth(int num)
         {
             if (num < 1 || num > 28)
             {
                 throw new ArgumentException("无效的数字。请提供1到28之间的数字。");
             }
             return num;
         }

两个日期范围判定的方法


        static void Main(string[] args)
         {           
 
             TaskSchedulerConfig taskSchedulerConfig;
             try
             {
                 var taskSchedulerConfigJson = args[0];
                 taskSchedulerConfig = JsonConvert.DeserializeObject<TaskSchedulerConfig>(taskSchedulerConfigJson);
             }
             catch
             {
                 string demo = @"{
                           ""ApplicationPath"": ""C:\\YourApplication\\YourExecutable.exe"",
                           ""TaskName"": ""DailyTask"",
                           ""TaskDescription"": ""This is a daily task"",
                           ""TaskExecutionCycle"": 0,
                           ""StartBoundary"": ""2024/02/28 08:00:00"",
                           ""DaysOfMonth"": 28,
                           ""DaysOfWeek"": 3
                         }";
 
                 Console.WriteLine($"参数错误,正确示例:{demo}");
                 return;
             }
 
 
             try
             {
                 using (TaskService taskService = new TaskService())
                 {
                     // 创建一个新任务
                     TaskDefinition taskDefinition = taskService.NewTask();
                     taskDefinition.Principal.UserId = "SYSTEM"; // 设置为SYSTEM以在系统级别运行
                     // 设置任务的基本信息
                     taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription;
 
                     switch (taskSchedulerConfig.TaskExecutionCycle)
                     {
                         case 0:
                             DailyTrigger dailyTrigger = new DailyTrigger();
                             dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
                             dailyTrigger.DaysInterval = 1; // 每天执行
                             taskDefinition.Triggers.Add(dailyTrigger);
                             break;
                         case 1:
                             WeeklyTrigger weeklyTrigger = new WeeklyTrigger();
                             weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
                             weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek);
                             weeklyTrigger.WeeksInterval = 1; // 每隔1周执行
                             taskDefinition.Triggers.Add(weeklyTrigger);
                             break;
                         case 2:
                             MonthlyTrigger monthlyTrigger = new MonthlyTrigger();
                             monthlyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
                             monthlyTrigger.DaysOfMonth = new[] { GetDaysOfMonth(taskSchedulerConfig.DaysOfMonth) };
                             monthlyTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; // 每个月执行
                             taskDefinition.Triggers.Add(monthlyTrigger);
                             break;
                         default:
                             Console.WriteLine("任务执行周期参数错误!正确示例:0 每日执行 1 每周执行 2 每月执行");
                             break;
                     }
 
 
 
                     // 设置要执行的程序路径
                     taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null));
 
                     // 将任务注册到 Windows 任务计划程序
                     taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition);
                     Console.WriteLine("任务计划创建成功!");
                 }
             }
             catch (Exception ex)
             {
                 Console.WriteLine($"创建{taskSchedulerConfig.TaskName} 任务错误,错误原因是:{ex.Message}");
             }
 
            
         }

 

 

复制代码
 1 public class TaskSchedulerConfig
 2 {
 3     /// <summary>
 4     /// 引用程序路径
 5     /// </summary>
 6     public string ApplicationPath { get; set; }
 7     /// <summary>
 8     /// 引用程序参数
 9     /// </summary>
10     //public string ApplicationParameter { get; set; }
11     /// <summary>
12     /// 任务名称
13     /// </summary>
14     public string TaskName { get; set; }
15     /// <summary>
16     /// 任务说明
17     /// </summary>
18     public string TaskDescription { get; set; }
19     /// <summary>
20     /// 任务执行周期 0 每日执行 1 每周执行 2 每月执行
21     /// </summary>
22     public int TaskExecutionCycle { get; set; }
23     /// <summary>
24     /// 开始执行时间范围 yyyy/MM/dd HH:mm:ss
25     /// </summary>
26     public DateTime StartBoundary { get; set; }
27     /// <summary>
28     /// 每月的第几号执行
29     /// </summary>
30     public int DaysOfMonth { get; set; }
31     /// <summary>
32     /// 每周的周几执行
33     /// </summary>
34     public int DaysOfWeek { get; set; }
35 
36 
37 }
1 /// <summary> 2 /// 根据数字1-7来设置周一 - 周日 3 /// </summary> 4 /// <param name="num"></param> 5 /// <returns></returns> 6 static DaysOfTheWeek GetDaysOfTheWeek(int num) 7 { 8 switch (num) 9 { 10 case 1: 11 return DaysOfTheWeek.Monday; 12 case 2: 13 return DaysOfTheWeek.Tuesday; 14 case 3: 15 return DaysOfTheWeek.Wednesday; 16 case 4: 17 return DaysOfTheWeek.Thursday; 18 case 5: 19 return DaysOfTheWeek.Friday; 20 case 6: 21 return DaysOfTheWeek.Saturday; 22 case 7: 23 return DaysOfTheWeek.Sunday; 24 default: 25 throw new ArgumentException("无效的数字。请提供1到7之间的数字。"); 26 } 27 } 28 /// <summary> 29 /// 限定每月只能在1-28号之间执行任务 30 /// </summary> 31 /// <param name="num"></param> 32 /// <returns></returns> 33 static int GetDaysOfMonth(int num) 34 { 35 if (num < 1 || num > 28) 36 { 37 throw new ArgumentException("无效的数字。请提供1到28之间的数字。"); 38 } 39 return num; 40 }
1 static void Main(string[] args) 2 { 3 4 TaskSchedulerConfig taskSchedulerConfig; 5 try 6 { 7 var taskSchedulerConfigJson = args[0]; 8 taskSchedulerConfig = JsonConvert.DeserializeObject<TaskSchedulerConfig>(taskSchedulerConfigJson); 9 } 10 catch 11 { 12 string demo = @"{ 13 ""ApplicationPath"": ""C:\\YourApplication\\YourExecutable.exe"", 14 ""TaskName"": ""DailyTask"", 15 ""TaskDescription"": ""This is a daily task"", 16 ""TaskExecutionCycle"": 0, 17 ""StartBoundary"": ""2024/02/28 08:00:00"", 18 ""DaysOfMonth"": 28, 19 ""DaysOfWeek"": 3 20 }"; 21 22 Console.WriteLine($"参数错误,正确示例:{demo}"); 23 return; 24 } 25 26 27 try 28 { 29 using (TaskService taskService = new TaskService()) 30 { 31 // 创建一个新任务 32 TaskDefinition taskDefinition = taskService.NewTask(); 33 taskDefinition.Principal.UserId = "SYSTEM"; // 设置为SYSTEM以在系统级别运行 34 // 设置任务的基本信息 35 taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription; 36 37 switch (taskSchedulerConfig.TaskExecutionCycle) 38 { 39 case 0: 40 DailyTrigger dailyTrigger = new DailyTrigger(); 41 dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; 42 dailyTrigger.DaysInterval = 1; // 每天执行 43 taskDefinition.Triggers.Add(dailyTrigger); 44 break; 45 case 1: 46 WeeklyTrigger weeklyTrigger = new WeeklyTrigger(); 47 weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; 48 weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek); 49 weeklyTrigger.WeeksInterval = 1; // 每隔1周执行 50 taskDefinition.Triggers.Add(weeklyTrigger); 51 break; 52 case 2: 53 MonthlyTrigger monthlyTrigger = new MonthlyTrigger(); 54 monthlyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; 55 monthlyTrigger.DaysOfMonth = new[] { GetDaysOfMonth(taskSchedulerConfig.DaysOfMonth) }; 56 monthlyTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; // 每个月执行 57 taskDefinition.Triggers.Add(monthlyTrigger); 58 break; 59 default: 60 Console.WriteLine("任务执行周期参数错误!正确示例:0 每日执行 1 每周执行 2 每月执行"); 61 break; 62 } 63 64 65 66 // 设置要执行的程序路径 67 taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null)); 68 69 // 将任务注册到 Windows 任务计划程序 70 taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition); 71 Console.WriteLine("任务计划创建成功!"); 72 } 73 } 74 catch (Exception ex) 75 { 76 Console.WriteLine($"创建{taskSchedulerConfig.TaskName} 任务错误,错误原因是:{ex.Message}"); 77 } 78 79 80 }
复制代码 Main

 

 

2024-02-28 16:50:17【出处】:https://www.cnblogs.com/INetIMVC/p/18040041

=======================================================================================

标签:case,Task,return,get,c#,4.8,StartBoundary,public,taskSchedulerConfig
From: https://www.cnblogs.com/mq0036/p/18041048

相关文章

  • Rust的Cow类型有什么用?详解Cow及其用途
    Rust的智能指针有哪些?大多数人都能马上答出Box<T>、Rc<T>和Arc<T>、Ref<T>和在异步编程中很常见的Pin<P>等等。不过,有一个可能经常被大多数人遗忘的类型,它功能强大,利用好了可以节省很多复制开销;它就是这篇文章的主角:Cow<B>。什么是COW(Copy-On-Write)?在开始之前,有必要先介绍一下CO......
  • CSDN以及博客园如何转载别人的文章
    1、找到要转载的文章,用chrome浏览器打开,右键选择检查2、在chrome中下方的框里找到对应的内容,html脚本中找到对应的节点(article_content),选中节点,网页上被选中内容会被高亮显示,然后右键菜单选中Copy–>CopyouterHTML3、进入直接的博客主界面,选择”写博客“,直接将chrome......
  • 面试题 02.07. 链表相交C
    利用链表的特性,如果相交的话,后面就不可能岔开!你可以想象把他们有同一个尾巴,然后从尾巴往前看。所以只要知道两个链表的长度,就可以在同一起跑线上一起比较了。/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;......
  • Codeforces 1705F Mark and the Online Exam
    先问全\(\texttt{T}\),记得到的数为\(a\)。接下来问\(len\)个位置为\(\texttt{T}\),得到的数为\(b\)。因为剩下\(n-len\)个位置肯定都会被刚好算上一次,对于这\(len\)个数里的\(\texttt{T}\)的个数\(x\)就有式子\((n-len)+2x=a+b\),可以解得\(x=\frac{......
  • 通过前向声明解决C++中两个头文件互相引用的问题
    在C++中,当两个头文件互相引用时,可以通过前向声明来避免直接的#include依赖,从而解决循环依赖的问题。前向声明是在一个头文件中声明另一个头文件中的类或类型的名称,而不包括其具体的实现细节。这样,每个头文件只依赖对方的声明,而不需要依赖对方的定义,从而打破了循环依赖。以下是如......
  • CentOS7 安装FastDFS配置详解
    一、介绍FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括:文件存储,文件同步和文件访问(文件上传和文件下载),它可以解决高容量和负载平衡问题。FastDFS应该满足基于照片共享站点和视频共享站点等文件的网站的要求。FastDFS具有两个角色:tracker和storage。tracker负责调......
  • ssts-hospital-web-master项目实战记录二十九:项目迁移-Hook实现(useDictStore)
    记录时间:2024-02-28一、useDictStore模块实现const/index.ts//常量constDICT_VERSIONDATA='versionData'constDICT_PAGE='page'constDICT_COMMON='common'constDICT_DEVICE='device'constDICT_SYSTEM='system......
  • 关于“非法的前向引用(illegal forward reference)”的探究
    1.问题:有如下代码:publicclassTest{static{i=0;//给变量赋值可以正常编译通过System.out.print(i);//编译器会提示“非法向前引用”(illegalforwardreference)}staticinti=1;}这段代码来自于《深入理解Java虚拟机:JVM高级特性......
  • 19. 删除链表的倒数第 N 个结点C
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*removeNthFromEnd(structListNode*head,intn){if(!head)returnNULL;inti=0;structListNode*tem=head;......
  • 脚本检查IP地址和MAC是否对应
    需求需要把一批次的IP地址和MAC地址进行绑定,如果该IP地址没有和MAC对应则输出脚本如下#catcheck_arp.sh#!/bin/bash#检查ip地址和mac是否对应IpList=()MacList=("<incomplete>""<incomplete>""<incomplete>""74:56:3c:63:c4:c7""<incom......