N:Microsoft.PowerShell.ScheduledJob 名前空間によって公開されているオブジェクトを使用して、スケジュールされたジョブを作成し、実行日時を定義し、実行後に完了したジョブに関する結果を取得できます。
ジョブのトリガー
スケジュールされたジョブを作成する最初の手順は、ジョブを実行するタイミングを指定することです。 これを行うには、T:Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger オブジェクトを作成して構成します。 次のコードでは、20 秒後に 1 回実行するようにジョブをスケジュールするトリガーを作成します。
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 スクリプト ブロックを含むファイルへのパス。 |
InitializationScript | ジョブを初期化する 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);
}
}
}
}
}
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
PowerShell