相信有看过我上一篇《C# 定时任务之windows任务计划程序》并且有需求的朋友已经打开过任务计划程序去尝试了,同时是否有了另一个疑问。里面已经存在的任务是怎么来的呢?能否通过我们自己的程序去创建呢?答案当然是可以的!本篇我们来实现一下
这里我们会用到taskschd.dll这个dll,可以从网上下载,也可以在电脑C:\Windows\System32查找到(一般都可以,如果不缺失的话),然后引用到我们的项目中,并将嵌入互操作类型改为false
实现功能:
添加任务到Windows任务计划程序
开发环境:
开发工具: Visual Studio 2013
.NET Framework版本:4.5
实现代码:
/// <summary>/// 添加Windows任务计划/// </summary>/// <param name="taskName">任务名称</param>/// <param name="exePath">执行程序路径</param>/// <param name="interval">计划任务执行的频率/// https://docs.microsoft.com/en-us/windows/win32/taskschd/repetitionpattern-interval/// </param>/// 在系统C:\Windows\System32找到taskschd.dll并引用到项目中,选中dll将嵌入互操作类型改为false///更多文档参考 https://docs.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-pagestatic void AddWinTask(string taskName, string exePath, string interval){TaskSchedulerClass scheduler = new TaskSchedulerClass();scheduler.Connect();ITaskFolder folder = scheduler.GetFolder("\\");//获取所有TaskIRegisteredTaskCollection tasks = folder.GetTasks(1);//判断该Task是否已存在bool isExists = false;for (int i = 1; i < tasks.Count; i++){if (tasks[i].Name.Equals(taskName)){isExists = true;break;}}//如果已存在则先删除if (isExists){folder.DeleteTask(taskName, 0);}//创建新的TaskITaskDefinition task = scheduler.NewTask(0);task.RegistrationInfo.Description = taskName;// IDailyTrigger、IMonthlyTrigger、IEventTriggerITimeTrigger triger = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);//执行间隔triger.Repetition.Interval = interval;//任务开始时间(第一次执行时间)triger.StartBoundary = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");//指定要执行的程序路径IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);action.Path = exePath;//设置参数action.Arguments = "C#";//注册任务并开启执行IRegisteredTask regTask = folder.RegisterTaskDefinition(taskName, task,(int)_TASK_CREATION.TASK_CREATE,null,null,_TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN);IRunningTask runTask = regTask.Run(null);}
//此处直接调用
//每2分钟执行一次
AddWinTask("mytask", @"D:test.exe", "PT2M");
更多的使用方法我已再注释中标明了帮助文档链接。
由简入繁,拿来即用
更多精彩,请搜索公众号:Csharp 小记