编辑任务计划程序任务C#

时间:2017-01-05 07:01:17

标签: c# scheduled-tasks

我正在使用任务计划程序托管包装程序从外部程序(SharePoint)创建计划任务创建和读取任务很好但是我无法找到一种方法来编辑任务一旦注册,我是否必须重新 - 以某种方式注册新任务或执行更新请求?

注册我的任务:

TaskDefinition newTask = taskService.NewTask();
newTask.RegistrationInfo.Description = (string)timerJobItem.FieldValues["Description"];
newTask.Principal.LogonType = TaskLogonType.InteractiveToken;

// Switch for different schedule options, use createTriggers method
List<Trigger> triggers = createTriggers((string)timerJobItem["Schedule"], (DateTime)timerJobItem["StartTime"]);
newTask.Triggers.Add(triggers.First());

// Create Action to add to new Task
newTask.Actions.Add(new ExecAction((string)timerJobItem["Action"], (string)timerJobItem["Arguments"], null));
// Create Task
taskService.RootFolder.RegisterTaskDefinition(jobName, newTask);

然后我发现调度程序中的任务有效,但是当我尝试进行更改时,没有任何反应:

// Method to get all Tasks that match a name - Working
private Task[] GetAllTasks(string regexString)
    {
        Regex regex = new Regex(String.Format(@"{0}", regexString));
        using (TaskService taskService = new TaskService())
        {
            Task[] allTasksCollection = taskService.FindAllTasks(regex, true);
            foreach (Task task in allTasksCollection)
            {
                Console.WriteLine(task.Name);
            }
            return allTasksCollection;
        };
    }

....

// Get a single timer job
Task[] allTimerJobs = GetAllTasks(prefix);
List<Task> allTimerJobsList = allTimerJobs.Cast<Task>().ToList();
string jobName = String.Format("{0}[{1}].{2}", prefix, (int)timerJobItem["ID"], jobReference);

// Get Task by name
int indexOfJob = allTimerJobsList.FindIndex(t => t.Name == jobName);
Task matchingJob = allTimerJobsList[indexOfJob];

// No Error but nothing happens to task
matchingJob.Definition.Triggers.Clear();

// No Error but nothing happens to task
matchingJob.Definition.Settings.Enabled = false;

TIA

3 个答案:

答案 0 :(得分:0)

我发现编辑任务的唯一方法是将定义复制到新任务并再次在RootFolder中注册。

以下示例将描述更改为新值,任务名称必须匹配或将创建新任务:

TaskDefinition td = taskService.NewTask();
td = existingJob.Definition;
td.RegistrationInfo.Description = "New Value";
taskService.RootFolder.RegisterTaskDefinition(jobName, td);

答案 1 :(得分:0)

要修改通过GetAllTask​​s方法找到的结果,应在函数外声明using语句,并将其作为参数发送。

private Task[] GetAllTasks(TaskService taskService, string regexString)
{
    Regex regex = new Regex(String.Format(@"{0}", regexString));

    Task[] allTasksCollection = taskService.FindAllTasks(regex, true);
        foreach (Task task in allTasksCollection)
        {
            Console.WriteLine(task.Name);
        }
        return allTasksCollection;

}

在修改方法中使用该方法声明using语句

// Get a single timer job
using (TaskService taskService = new TaskService())
{
    Task[] allTimerJobs = GetAllTasks(taskService, prefix);
    List<Task> allTimerJobsList = allTimerJobs.Cast<Task>().ToList();
    string jobName = String.Format("{0}[{1}].{2}", prefix, (int)timerJobItem["ID"],jobReference);
    // Get Task by name
    int indexOfJob = allTimerJobsList.FindIndex(t => t.Name == jobName);
    Task matchingJob = allTimerJobsList[indexOfJob];
    // No Error but nothing happens to task
    matchingJob.Definition.Triggers.Clear();
    // No Error but nothing happens to task
    matchingJob.Definition.Settings.Enabled = false;
}

答案 2 :(得分:0)

我知道这是3年前,但是您是否尝试过:

td.RegisterChanges();