可以使用 N:Microsoft.PowerShell.ScheduledJob 命名空间公开的对象来创建计划作业,定义作业的运行时间,并在运行完成后获取有关已完成作业的结果。
触发作业
创建计划作业的第一步是指定作业何时应运行。 为此,请创建和配置 T:Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger 对象。 以下代码创建一个触发器,该触发器计划作业在将来运行一次 20 秒。
ScheduledJobTrigger jobTrigger = ScheduledJobTrigger.CreateOnceTrigger(
DateTime.Now.AddSeconds(20), // Create trigger to start job 20 seconds after now.
TimeSpan.Zero, // No random delay
null, // No repetition interval time
null, // No repetition interval duration
1, // Trigger Id
true); // Create trigger enabled
定义作业
通过创建参数字典来定义 Windows PowerShell 作业。 支持以下参数。
参数名称 | 说明 |
---|---|
名字 | 作业的名称。 |
ScriptBock | 指定作业执行的作的 Windows PowerShell 脚本块。 |
FilePath | 包含 Windows PowerShell 脚本块的文件的路径,用于指定作业的作用。 |
初始化Script | 初始化作业的 Windows PowerShell 脚本块。 |
ArgumentList | 一个对象数组,该数组指定作业采用的参数。 |
RunAs32 | 一个布尔值,该值指定是否在 32 位进程中运行作业。 |
以下代码创建参数字典对象并设置 Name 和 ScriptBlock 参数。
string schedJobDefName = "MySampleSchedJob";
Dictionary<string, object> jobDefParameters = new Dictionary<string, object>();
jobDefParameters.Add("Name", schedJobDefName); // Unique name is required.
ScriptBlock scriptBlock = ScriptBlock.Create(@"1..5 | foreach {sleep 1; ""SchedJobOutput $_""}");
jobDefParameters.Add("ScriptBlock", scriptBlock); // A scriptblock or script FilePath
// is required.
创建调用和作业定义对象
然后创建 ScheduledJobInvocationInfo 和 ScheduledJobDefinition 对象来运行作业。 以下代码演示了这一点。
ScheduledJobInvocationInfo jobInvocationInfo = new ScheduledJobInvocationInfo(
nw JobDefinition(typeof(ScheduledJobSourceAdapter), scriptBlock.ToString(), schedJobDefName),
jobDefParameters);
schedJobDefinition = new ScheduledJobDefinition(
jobInvocationInfo, // Defines the PowerShell job to run.
new ScheduledJobTrigger[1] { jobTrigger }, // Defines when to run the PowerShell job.
null, // No custom options. We accept default.
null); // No credentials. PowerShell job is run
// in default Task Scheduler process, account.
向任务计划程序注册作业
以下代码将作业注册到 Windows 任务计划程序。
schedJobDefinition.Register();
registrationSucceeded = true;
Console.WriteLine("Scheduled job has been registered. Waiting 30 seconds for it to be started and run.");
完整代码示例
下面是从中获取之前代码片段的完整代码示例。
using System;
using System.Threading;
using System.Collections.Generic;
using System.Management.Automation; // Windows PowerShell namespace.
using Microsoft.PowerShell.ScheduledJob; // Windows PowerShell ScheduledJob namespace.
namespace Microsoft.Samples.PowerShell.ScheduledJob
{
/// <summary>
/// This class contains the Main entry point for the application.
/// </summary>
public class ScheduledJobSample
{
/// <summary>
/// This sample shows how to use the PowerShell ScheduledJob API to create
/// a simple PowerShell scheduled job, register it with a trigger object
/// that defines when the job will run and retrieve job run results from
/// the job file store.
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
// ScheduledJobDefinition contains all elements of a PowerShell scheduled
// job including the PowerShell job script or script file path, scheduling
// triggers, and scheduling options.
ScheduledJobDefinition schedJobDefinition = null;
bool registrationSucceeded = false;
try
{
// First create a scheduled job trigger object. This object will
// define when the PowerShell job is scheduled to run. For this
// example we will create a trigger to run the job just one time
// 20 seconds after the trigger object is created.
// Note: If you are stepping through this code in a debugger you
// may want to increase the 20 seconds value so that the trigger time
// remains in the future once you register the scheduled job.
ScheduledJobTrigger jobTrigger = ScheduledJobTrigger.CreateOnceTrigger(
DateTime.Now.AddSeconds(20), // Create trigger to start job 20 seconds after now.
TimeSpan.Zero, // No random delay
null, // No repetition interval time
null, // No repetition interval duration
1, // Trigger Id
true); // Create trigger enabled
// Create a parameter dictionary that defines the PowerShell job.
// For this example we will create a simple script that runs for
// 5 seconds generating output.
// Here are the parameters supported to define the PowerShell job.
// Name - Job name string.
// ScriptBlock - PowerShell ScriptBlock type.
// FilePath - PowerShell script file path string.
// InitializationScript - PowerShell Scriptblock type.
// ArgumentList - object[] type.
// RunAs32 - Switch (boolean type).
string schedJobDefName = "MySampleSchedJob";
Dictionary<string, object> jobDefParameters = new Dictionary<string, object>();
jobDefParameters.Add("Name", schedJobDefName); // Unique name is required.
ScriptBlock scriptBlock = ScriptBlock.Create(@"1..5 | foreach {sleep 1; ""SchedJobOutput $_""}");
jobDefParameters.Add("ScriptBlock", scriptBlock); // A scriptblock or script FilePath
// is required.
// Now create a JobInvocation object that contains all information about
// the PowerShell job to run.
ScheduledJobInvocationInfo jobInvocationInfo = new ScheduledJobInvocationInfo(
new JobDefinition(typeof(ScheduledJobSourceAdapter), scriptBlock.ToString(), schedJobDefName),
jobDefParameters);
// Finally create the scheduled job definition object that pulls all
// of this information together.
schedJobDefinition = new ScheduledJobDefinition(
jobInvocationInfo, // Defines the PowerShell job to run.
new ScheduledJobTrigger[1] { jobTrigger }, // Defines when to run the PowerShell job.
null, // No custom options. We accept default.
null); // No credentials. PowerShell job is run
// in default Task Scheduler process, account.
// Next we register this scheduled job object with Windows Task Scheduler.
// The Task Scheduler will run the PowerShell script based on the provided job trigger.
schedJobDefinition.Register();
registrationSucceeded = true;
Console.WriteLine("Scheduled job has been registered. Waiting 30 seconds for it to be started and run.");
// You can see this PowerShell job task registered in the Task Scheduler UI.
// Look under path: Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
// Wait for Task Scheduler to run the PowerShell job. This should happen in 20 seconds
// and then the job will take about 5 seconds to run. If PowerShell job task doesn't
// run try increasing the trigger time in the ScheduledJobTrigger object. You can also
// run this task manually from the Task Scheduler UI.
for (int count = 1; count < 31; ++count)
{
Thread.Sleep(1000);
Console.WriteLine(count + " seconds elapsed");
}
Console.WriteLine();
Console.WriteLine("Job run results.");
Console.WriteLine();
// Since the PowerShell job runs in a non-interactive Task Scheduler
// process the job status and output data is written to a file based
// job store and the directory location is the current user local app
// data ($Env:LOCALAPPDATA).
// This job store can be accessed through the ScheduledJobSourceAdapter class.
ScheduledJobSourceAdapter schedJobSourceAdapter = new ScheduledJobSourceAdapter();
IList<Job2> jobRuns = schedJobSourceAdapter.GetJobs();
foreach (var jobRun in jobRuns)
{
// Check for jobs in finished state.
// Note that job data is not written to the job store until the job
// has reached a finished state.
JobState jobState = jobRun.JobStateInfo.State;
if (jobState == JobState.Completed ||
jobState == JobState.Stopped ||
jobState == JobState.Failed)
{
// Write job run finished state.
Console.WriteLine("Job Status: " + jobRun.JobStateInfo.State);
Console.WriteLine();
Console.WriteLine("Job Data");
// Write output data.
foreach (var item in jobRun.Output)
{
Console.WriteLine(item.ToString());
}
// Write any errors.
foreach (var item in jobRun.Error)
{
Console.WriteLine(item.ToString());
}
}
}
Console.WriteLine();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
catch (ScheduledJobException e)
{
Console.WriteLine("Error: " + e.Message);
}
finally
{
// Unregister this scheduled job or an error will be thrown when
// running this sample code again (scheduled job already exists.)
// because all registered scheduled jobs must have a unique name.
if (registrationSucceeded)
{
schedJobDefinition.Remove(true);
}
}
}
}
}