我正在使用任务计划程序托管包装器从外部程序(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;
蒂亚
我发现编辑任务的唯一方法是将定义复制到新任务中,然后再次在根文件夹中注册。
以下示例将描述更改为新值,任务名称必须匹配,否则将创建新任务:
TaskDefinition td = taskService.NewTask();
td = existingJob.Definition;
td.RegistrationInfo.Description = "New Value";
taskService.RootFolder.RegisterTaskDefinition(jobName, td);
我知道
这是 3 年前的事了,但你试过吗:
td.RegisterChanges();
要修改通过 GetAllTasks 方法找到的结果,您应该在函数中声明 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;
}