Planowanie zadań przy użyciu interfejsu API programu Windows PowerShell
Obiekty udostępniane przez przestrzeń nazw N:Microsoft.PowerShell.ScheduledJob można użyć do utworzenia zaplanowanego zadania, zdefiniowania jego uruchomienia i uzyskania wyników dotyczących ukończonego zadania po jego uruchomieniu.
Wyzwalanie zadania
Pierwszym krokiem tworzenia zaplanowanego zadania jest określenie, kiedy zadanie powinno zostać uruchomione. W tym celu należy utworzyć i skonfigurować obiekt T:Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger. Poniższy kod tworzy wyzwalacz, który planuje uruchomienie zadania w ciągu 20 sekund w przyszłości.
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
Definiowanie zadania
Zadanie tworzenia Windows PowerShell przez utworzenie słownika parametrów. Obsługiwane są następujące parametry.
Nazwa parametru | Opis |
---|---|
Nazwa | Nazwa zadania. |
ScriptBock | Blok Windows PowerShell, który określa, co robi zadanie. |
Filepath | Ścieżka do pliku zawierającego Windows PowerShell skryptu, który określa, co robi zadanie. |
InitializationScript | Blok Windows PowerShell skryptu, który inicjuje zadanie. |
Lista argumentów | Tablica obiektów, które określają argumenty, które przyjmuje zadanie. |
Uruchom jako 32 | Wartość logiczna określająca, czy zadanie ma być uruchamiane w procesie 32-bitowym. |
Poniższy kod tworzy obiekt słownika parametrów i ustawia parametry Name i 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.
Tworzenie obiektów wywołania i definicji zadania
Następnie utworzysz obiekty ScheduledJobInvocationInfo i ScheduledJobDefinition, aby uruchomić zadanie. Przedstawiono to w poniższym kodzie.
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.
Rejestrowanie zadania za pomocą Harmonogram zadań
Poniższy kod rejestruje zadanie w Windows Harmonogram zadań.
schedJobDefinition.Register();
registrationSucceeded = true;
Console.WriteLine("Scheduled job has been registered. Waiting 30 seconds for it to be started and run.");
Kompletny przykład kodu
Poniżej przedstawiono kompletny przykład kodu, z którego zostały wykonane poprzednie fragmenty kodu.
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);
}
}
}
}
}
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla