分享一个我自己写的 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. Windows 可以操纵linux内文件,与本地一致的工具

    https://github.com/allanrbo/filesremote/releases/ 感觉挺好的.

  2. 使用yagmail发送邮件

    一.yagmail基本数据准备 1.终端下载yagmail:pip install yagmail 2.获取SMTP和密钥 我们以新浪邮箱为例,登录成功后进入设置页面,点击客户端pop/imap/sm ...

  3. 在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果

    我在前面随笔<在Winform系统开发中,对表格列表中的内容进行分组展示>,介绍了Winform程序中对表格内容进行了分组的展示,在WPF应用中,同样也可以对表格的内容进行分组展示,不过处 ...

  4. Vue2 里如何优雅的清除一个定时器

    绝大多数人清除定时器的方法 <script> export default { data() { return { timer: null } }, mounted() { this.ti ...

  5. node中的优先从缓存中加载模块与模块的加载规则

    执行 node main.js 请问 b模块会被加载几次 //main.js require('./a.js') var fn = require('./b.js') console.log(fn.s ...

  6. js中数组reduce的使用原来这么简单

    reduce 的学习方法 array.reduce(callback(prev, currentValue, index, arr), initialValue) //简写就是下面这样的 arr.re ...

  7. elementui 的tabs组件出现蓝色边框问题

    elementui 的tabs组件出现蓝色边框问题 /deep/ .el-tabs__item:focus.is-active.is-focus:not(:active) { -webkit-box- ...

  8. 【小测试】fastcgo 调用 c 代码

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 找到了一个项目 https://github.com/pe ...

  9. 【小测试】rust中的数组越界——好吧,这下证明rust不是零成本抽象了吧

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.编译期发现的数组越界 在数组下标是常量的情况下,编译期 ...

  10. CLion搭建Qt开发环境,并解决目录重构问题(最新版)

    序言 Qt版本不断更新,QtCreator也不断更新.在Qt4和Qt5时代,我一直认为开发Qt最好的IDE就是自带的QtCreator,可是时至今日,到了Qt6时代,QtCreator已经都12.0. ...