分享一个我自己写的 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. 【JS 逆向百例】WebSocket 协议爬虫,智慧树扫码登录案例分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  2. Fabric网络升级(三)

    原文来自这里. 如果不熟悉capability,那么操作前可以查阅Capabilities.需要注意的是在启用capabilities前,需要升级归属该通道的peer节点和排序节点. 更多关于最新版F ...

  3. DES加密和base64加密

    DES简介:参考知乎 https://www.zhihu.com/question/36767829 和博客https://www.cnblogs.com/idreamo/p/9333753.html ...

  4. lua开发和调试环境

    Lua开发环境搭建 Lua官网提供源码下载需要自己编译,Lua官网:https://www.lua.org/ftp/ lua for windows.exe(占二十多MB那个) 目前在网络上没有找到 ...

  5. 数据挖掘机器学习[二]---汽车交易价格预测详细版本{EDA-数据探索性分析}

    题目出自阿里天池赛题链接:零基础入门数据挖掘 - 二手车交易价格预测-天池大赛-阿里云天池 相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据 ...

  6. 7.5 Windows驱动开发:监控Register注册表回调

    在笔者前一篇文章<内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通 ...

  7. yarn常用命令

    1. 安装 npm install yarn -g 2. 设置淘宝镜像 yarn config set npmRegistryServer https://registry.npm.taobao.or ...

  8. 飞桨paddlespeech语音唤醒推理C INT8 定点实现

    前面的文章(飞桨paddlespeech语音唤醒推理C定点实现)讲了INT16的定点实现.因为目前商用的语音唤醒方案推理几乎都是INT8的定点实现,于是我又做了INT8的定点实现. 实现前做了一番调研 ...

  9. 从浏览器原理出发聊聊 Chrome 插件

    浏览器架构演进 单进程浏览器时代 单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络.插件.JavaScript 运行环境.渲染引擎和页面等.在 2007 年之前,市面上浏 ...

  10. Bellman-Ford算法实现带有负权边的单源最短路

    Bellman-Ford算法 对于Dijkstra算法,不妨给出这样一个例子 graph LR A((A)) -->|1| C((C)) A -->|2|D((D)) D -->|- ...