分享一个我自己写的 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. [转帖]Linux命令学习手册-readelf

    https://www.jianshu.com/p/405844abefae readelf elf-file(s) 功能 用于显示 elf 格式文件的信息. 描述 readelf 用来显示一个或者多 ...

  2. [转帖]Nginx动静分离详解以及配置

    https://developer.aliyun.com/article/885602?spm=a2c6h.24874632.expert-profile.314.7c46cfe9h5DxWK 简介: ...

  3. [转帖]CKA 真题

    https://segmentfault.com/a/1190000021380185   1.列出pod并排序 kubectl get pod --sort-by .metadata.name 题目 ...

  4. date的命令使用.

    date命令的使用 1.直接用date命令显示日期时间 在命令行中输入date然后回车,显示结果"Wed Aug 7 08:58:07 CST 2019".这是系统根据设定的时区显 ...

  5. jenkins 安装与构建过程中的系列问题

    一.插件安装遇到的依赖问题 插件安装分为在线安装和离线安装 1.在线安装 搜索要安装的插件,然后进行安装即可 2.离线安装hpi文件 使用该方法安装插件每次只能安装一个插件,且如果插件之间存在依赖性则 ...

  6. mysql系列基础篇01---通用的语法及分类

    通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库.表.字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表的记录 DCL: 数 ...

  7. Leetcode 98题验证二叉搜索树(Validate Binary Search Tree) Java语言求解

    题目链接 https://leetcode-cn.com/problems/validate-binary-search-tree/ 题目内容 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设 ...

  8. 结构体定义及结构体粒度(alignment)

    结构体定义及结构体粒度(alignment) #pragma pack(1) typedef struct _STUDENT_INFORMATION_ { int Age; char v1; int ...

  9. vim 从嫌弃到依赖(15)——寄存器

    在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据.而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区 ...

  10. TienChin 活动管理-添加活动页面

    后端 ActivityController.java @Resource private IChannelService iChannelService; /** * 获取渠道列表 * * @retu ...