如何使用C#验证服务器上是否存在计划任务?

时间:2009-08-06 22:37:18

标签: c# .net scheduled-tasks

你怎么知道它是在运行,启用/禁用等?

3 个答案:

答案 0 :(得分:6)

您可以使用Task Scheduler API来访问有关任务的信息。 (它是一个com库,但您可以使用pinvokes从C#调用它)

article on codeproject为API提供.net包装。

[还有schtasks命令 - more info]

答案 1 :(得分:3)

可以安装via NuGet API。程序包名称为“ TaskScheduler”。 (https://github.com/dahall/taskscheduler

下面的示例显示如何测试是否使用任务名称安装了任务,如果没有安装,则每小时执行一次。

using (TaskService service = new TaskService())
{
    if (!service.RootFolder.AllTasks.Any(t => t.Name == "YourScheduledTaskName"))
    {
        Console.WriteLine("YourScheduledTaskName is not installed on this system. Do you want to install it now? (y/n)");
        var answer = Console.ReadLine();
        if (answer == "y")
        {
            var task = service.NewTask();
            task.RegistrationInfo.Description = "YourScheduledTaskDescription";
            task.RegistrationInfo.Author = "YourAuthorName";

            var hourlyTrigger = new DailyTrigger { StartBoundary = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 1, 0 , 0) };
            hourlyTrigger.Repetition.Interval = TimeSpan.FromHours(1);
            task.Triggers.Add(hourlyTrigger);

            var taskExecutablePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "YourScheduledTaskName.exe");
            task.Actions.Add(new ExecAction(taskExecutablePath));

            service.RootFolder.RegisterTaskDefinition("YourScheduledTaskName", task);
        }
    }
}

答案 2 :(得分:1)

btw,IRT我接受的解决方案,这里是验证scheduledTask存在所需的CodeProject包装器代码(请参阅http://www.codeproject.com/KB/cs/tsnewlib.aspx

我在集成测试中使用它,因此Assert是NUnit ..

public static void VerifyTask(string server, string scheduledTaskToFind)
{
     ScheduledTasks st = new ScheduledTasks(server);

     string[] taskNames = st.GetTaskNames();
     List<string> jobs = new List<string>(taskNames);

     Assert.IsTrue(jobs.Contains(scheduledTaskToFind), "unable to find " + scheduledTaskToFind);

     st.Dispose();
}

要检查它是否已启用,您可以执行以下操作:

Task task = st.OpenTask(scheduledTaskToFind);
Assert.IsTrue(task.Status != TaskStatus.Disabled);