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

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

 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

c# 4.8 实现Windows 定时任务计划(Task Scheduler)的更多相关文章

  1. windows 定时任务:schtasks,定时关闭网易云音乐

    大部分属于转载和粘贴. 使用命令:schtasks windows 定时任务   使用样例: 每天定时关闭网易云音乐: 每天22:20关闭网易云音乐: schtasks /create /tn &qu ...

  2. Windows下计划任务的使用

    0x01 前言 在渗透测试中,尤其是域渗透,常常会用到Windows系统的计划任务,一是用于远程启动程序,二是用于程序的自启动 那么,计划任务具体有哪些使用技巧呢?是否对权限有要求?一定需要管理员权限 ...

  3. 在Windows Server 2012的Task Scheduler里面配置自动发送邮件

    最近在一台server上配置了每个周末备份数据库的定时任务,想顺手配置发送备份完成的邮件提醒我去Double Check一下备份结果. 悲剧地发现Send an email功能被新版的server给禁 ...

  4. Windows任务计划

    任务计划,可以将任何脚本.程序或文档安排在某个时间运行.“任务计划”在每次启动windows系统的时候自动启动(默认Task Scheduler服务是开启的)并在后台运行.使用“任务计划”可以完成以下 ...

  5. 使用C#创建计划任务(How to create a Task Scheduler use C# )

    本文主要讲解了如何使用C#来创建windows计划任务. 需求:在不定时间段运行多个后台程序(winfrom,wpf,console,等等)用于更新数据.  问题:为什么要使用计划任务,而不直接在程序 ...

  6. Windows任务计划程序起始于参数自动修改

    Windows任务计划程序建立后,手工运行可以成功,但计划任务自动运行却不能成功,搜索网络,原来是起始于参数没有配置,这个参数的英文名字是start-in.它保证任务计划程序的WorkingDirec ...

  7. 在WINDOWS任务计划程序下执行PHP文件 PHP定时功能的实现

    最近需要做一个定时任务功能,从网站找了很多相关的代码,windows实现方法综合起来大概就两种, 一.使用PHP ignore_user_abort 函数 即使关掉浏览器也能正常运行:(个人感觉PHP ...

  8. windows 定时任务 - 定时关机

    添加定时关机,刚好可以利用windows定时任务 [开始]->[控制面板]->[任务计划]->[添加任务计划] 1.找到 shutdown.exe 设置每天执行 2.设置晚上10点 ...

  9. [经验分享]C# 操作Windows系统计划任务

    背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...

  10. .NET创建Windows定时任务

    创建Windows定时任务教程 1.创建一个控制台应用程序,保证程序正常运行. 2.右键点击我的电脑->点击管理. 3.在计算机管理弹出框->展开计算机管理(本地)->展开系统工具- ...

随机推荐

  1. CoreDNS的配置文件修改

    CoreDNS的配置文件修改 今天浪费了4个小时来调整coredns 这里简单记录一下 注意修改点: 1 kubernetes cluster.local. 需要增加集群内的配置 2 forward ...

  2. pytest-assume插件-多重校验

    自动化接口测试我们通常会对一条case设置多条断言,这样就会出现一个问题,如果前面一 个校验不通过,那么后面的校验就不会走到,如下图,可以看到校验走到assert False就不往 下走了,这个时候p ...

  3. vscode中快速声明数据类型

    如何快速声明数据类型 上面这张图 let obj1= reactive({ listArr: [], backArr: [{name:'张三',age:10, info:'本科'}], age: 10 ...

  4. echarts给每个柱状图配置不同的颜色

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 数组 vs. 切片

    在Go编程语言中处理数据时,经常会遇到数组和切片.这两者是不同的数据结构,有各自的特性和用途.本文将对Go中的数组和切片进行比较,以帮助大家更好地理解它们. 1. 长度不同 一个主要的区别是长度.在G ...

  6. 从零开始配置vim(28)——DAP 配置

    首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接.背面试题准备面试.好在最终找到了工作,也顺利入职了.期间也有朋友在催更,在这里我对关注本系列的朋友表示感谢.多的就不说了,我们正式进 ...

  7. springboot集成swagger之knife4j实战(升级版)

    官方文档链接:https://doc.xiaominfo.com/ 一.Knifej和swagger-bootstrap-ui对比 Knife4j在更名之前,原来的名称是叫swagger-bootst ...

  8. Mysql索引失效场景

    Mysql索引失效场景   序言   众所周知在Mysql中,通过使用索引的方式可以加快查询速度,从而避免全文搜索:而索引本身就像图书馆中所有书籍目录,通过查询关键字就能快速找到目标书籍在几列几行,这 ...

  9. 19.5 Boost Asio 传输结构体

    同步模式下的结构体传输与原生套接字实现方式完全一致,读者需要注意的是在接收参数是应该使用socket.read_some函数读取,发送参数则使用socket.write_some函数实现,对于套接字的 ...

  10. SpringBoot分布式任务中间件开发 附视频讲解 (手把手教你开发和使用中间件)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 分布式任务DcsSchedule中间件,Github地址:https://github.com ...