[C#] .NET调用Windows Scheduled Tasks 计划任

来源:互联网 发布:用友软件创始人 编辑:程序博客网 时间:2024/05/16 11:37

[C#] .NET调用Windows Scheduled Tasks 计划任务
2011-01-26 11:31


Windows Scheduled Tasks 计划任务可以定期执行任务,并且可以循环执行,在一些系统中,使用计划任务比我们创建Windows 服务,在其中使用Timer定时器来执行周期性任务更加的方便。微软针对各个系统平台开放了计划任务MSTASK的API,C/C++接口请参看MSDN文档:http://msdn.microsoft.com/zh-cn/library/aa446802。遗憾的是在.NET中并没有对这些接口进行封装,不过在CodePlex上,有开源的计划任务接口封装,详情参考:Task Scheduler Managed Wrapper

本文将介绍如何使用Windows计划任务的托管的封装接口,请首先下载此项目。

 1,创建测试项目

项目添加对Microsoft.Win32.TaskScheduler 的引用:

在Main方法中添加代码,运行根据用户输入执行相应的操作:添加计划任务、查询计划任务的状态、删除计划任务:

using System;
using System.Text;
using Microsoft.Win32.TaskScheduler;


namespace WindowsTaskSchedulerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ShowNavigationMsg();
            var input = "";
            var exit = false;
            while (exit == false && string.IsNullOrEmpty(input = Console.ReadKey().KeyChar.ToString().ToLower()) == false)
            {
                switch (input)
                {
                    case "a":
                        CreateTestTask();
                        break;
                    case "b":
                        RetrieveTestTask();
                        break;
                    case "c":
                        DeleteTestTask();
                        break;
                    case "d":
                        exit = true;
                        break;
                    default:
                        ShowNavigationMsg();
                        break;
                }
                
            }
        }

        private static void DeleteTestTask()
        {
            ShowNavigationMsg();
        }

        private static void RetrieveTestTask()
        {
            ShowNavigationMsg();
        }

        private static void CreateTestTask()
        {
            ShowNavigationMsg();
        }

        static void ShowNavigationMsg()
        {
            Console.WriteLine();
            Console.WriteLine("Please choose your action by input a charactor:");
            Console.WriteLine("[a]Add Test Task       [b]Retrieve Test Task Status ");
            Console.WriteLine("[c]Delete Test Task    [d]Eixt");
        }
    }
}

 2,创建计划任务

创建计划任务需要使用到以下类:

TaskService-计划任务服务;

TaskDefinition-定义一个计划任务;

DailyTrigger-Trigger中的一种,用于触发计划任务,触发器还包括Weekly、Monthly等等:

// Summary:
    //     Defines the type of triggers that can be used by tasks.
    public enum TaskTriggerType
    {
        // Summary:
        //     Triggers the task when a specific event occurs. Version 1.2 only.
        Event = 0,
        //
        // Summary:
        //     Triggers the task at a specific time of day.
        Time = 1,
        //
        // Summary:
        //     Triggers the task on a daily schedule.
        Daily = 2,
        //
        // Summary:
        //     Triggers the task on a weekly schedule.
        Weekly = 3,
        //
        // Summary:
        //     Triggers the task on a monthly schedule.
        Monthly = 4,
        //
        // Summary:
        //     Triggers the task on a monthly day-of-week schedule.
        MonthlyDOW = 5,
        //
        // Summary:
        //     Triggers the task when the computer goes into an idle state.
        Idle = 6,
        //
        // Summary:
        //     Triggers the task when the task is registered. Version 1.2 only.
        Registration = 7,
        //
        // Summary:
        //     Triggers the task when the computer boots.
        Boot = 8,
        //
        // Summary:
        //     Triggers the task when a specific user logs on.
        Logon = 9,
        //
        // Summary:
        //     Triggers the task when a specific user session state changes. Version 1.2
        //     only.
        SessionStateChange = 11,
    }

此枚举对应计划任务中的类型;

ExecAction-执行操作,定义计划任务需要执行的操作;

以及其它相关类。

修改CreateTestTask方法为:

private static void CreateTestTask()
        {
            // 计划任务服务
            TaskService ts = new TaskService();

            // 创建一个计划任务
            TaskDefinition td = ts.NewTask();
            td.RegistrationInfo.Description = "Test Scheduled Task";
            td.RegistrationInfo.Author = "Raymond";
            
            //每天启动
            Trigger dt = new DailyTrigger{DaysInterval = 1};
            //限制计划任务每次执行时间不能超过1小时
            dt.ExecutionTimeLimit = TimeSpan.FromHours(1);
            dt.StartBoundary = DateTime.Parse("12:00 AM");
            //全天重复执行
            dt.Repetition.Duration = TimeSpan.FromHours(24);
            //每隔30分钟重复一次
            dt.Repetition.Interval = TimeSpan.FromMinutes(30);
            //将触发器添加到计划任务td的触发器中
            td.Triggers.Add(dt);

            //创建一个执行操作
            var exe = new ExecAction("notepad.exe", "C://test.log", null);
            //添加执行操作到计划任务的操作中
            td.Actions.Add(exe);

            //注册计划任务
            ts.RootFolder.RegisterTaskDefinition(@"Test Task", td);

            ShowNavigationMsg();
        }

运行,输入a后,可以看到计划任务中以及增加了我们添加的计划任务,并且默认以系统账户System运行:

 2,查询计划任务状态

修改RetrieveTestTask方法为:

private static void RetrieveTestTask()
        {
            // 计划任务服务
            TaskService ts = new TaskService();
            Task t = ts.GetTask(@"Test Task");
            if (null != t)
            {
                Console.WriteLine("Task Name={0}", t.Name);
                Console.WriteLine("Task Execution Time={0}", t.LastRunTime);
                Console.WriteLine("Task Last Run Result={0}", t.LastTaskResult);
                Console.WriteLine("Task Next Execution Time={0}", t.NextRunTime);
            }
            ShowNavigationMsg();
        }

运行输入b,可以得到以下结果:


Please choose your action by input a charactor:
[a]Add Test Task       [b]Retrieve Test Task Status
[c]Delete Test Task    [d]Eixt
bTask Name=Test Task
Task Execution Time=1/1/0001 12:00:00 AM
Task Last Run Result=0
Task Next Execution Time=1/26/2011 11:30:00 AM

Please choose your action by input a charactor:
[a]Add Test Task       [b]Retrieve Test Task Status
[c]Delete Test Task    [d]Eixt

除此之外还可以通过Task.Definition 获取添加计划任务时的相关信息以及其它信息。

 3,删除计划任务

修改DeleteTestTask方法为:

private static void DeleteTestTask()
        {
            // 计划任务服务
            TaskService ts = new TaskService();
            ts.RootFolder.DeleteTask("Test Task");
            ShowNavigationMsg();
        }

运行输入c,在控制面板的计划任务Scheduled Tasks中,Test Task已经被删除了。

 4,其它说明

这个第三方组件,还提供了很多的对象,以及相关的方法,可以让我们方便的对计划任务进行管理,具体请大家在实践中探索,官方也有简单的文档:http://taskscheduler.codeplex.com/documentation

 原文:http://hi.baidu.com/1987raymond/blog/item/774a3f4fdd51b425afc3ab80.html