C#创建任务到Windows任务计划程序

相信有看过我上一篇《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-page

static void AddWinTask(string taskName, string exePath, string interval)
{
    TaskSchedulerClass scheduler = new TaskSchedulerClass();
    scheduler.Connect();
    ITaskFolder folder = scheduler.GetFolder("\\");

    //获取所有Task
    IRegisteredTaskCollection 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);
    }

    //创建新的Task
    ITaskDefinition task = scheduler.NewTask(0);
    task.RegistrationInfo.Description = taskName;

    // IDailyTrigger、IMonthlyTrigger、IEventTrigger
    ITimeTrigger 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");

更多的使用方法我已再注释中标明了帮助文档链接。