Importation et appel d’un workflow Windows PowerShell
Windows PowerShell 3, vous permet d’importer et d’appeler un flux de travail empaqueté en tant que module Windows PowerShell. Pour plus d’informations sur les modules Windows PowerShell, consultez Écriture d’un module Windows PowerShell.
La classe System.Management.Automation.Psjobproxyest utilisée comme proxy côté client pour les objets de flux de travail sur le serveur. La procédure suivante explique comment utiliser un objet System.Management.Automation.Psjobproxypour appeler un flux de travail.
Création d’un objet PSJobProxy pour exécuter des commandes de flux de travail sur un serveur distant.
Créez un objet System.Management.Automation.Runspaces.Wsmanconnectioninfopour créer une connexion à un espace d’exécution distant.
Définissez la propriété System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* de l’objet System.Management.Automation.Runspaces.Wsmanconnectioninfopour
Microsoft.PowerShell.Workflow
spécifier un point de terminaison Windows PowerShell.Créez un espace d’exécution qui utilise la connexion créée en effectuant les étapes précédentes.
Créez un objet System.Management.Automation.Powershellet définissez sa propriété System.Management.Automation.Powershell.Runspace* sur l’instance d’exécution créée à l’étape précédente.
Importez le module de flux de travail et ses commandes dans System.Management.Automation.Powershell.
Créez un objet System.Management.Automation.Psjobproxy et utilisez-le pour exécuter des commandes de workflow sur le serveur distant.
Exemple
L’exemple de code suivant montre comment appeler un flux de travail à l’aide de Windows PowerShell.
Cet exemple nécessite Windows PowerShell 3.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
namespace WorkflowHostTest
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Specify path to Workflow module");
return;
}
string moduleFile = args[0];
Console.Write("Creating Remote runspace connection...");
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
//Set the shellURI to workflow endpoint Microsoft.PowerShell.Workflow
connectionInfo.ShellUri = "Microsoft.PowerShell.Workflow";
//Create and open a runspace.
Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
Console.WriteLine("done");
PowerShell powershell = PowerShell.Create();
powershell.Runspace = runspace;
Console.Write("Setting $VerbosePreference=\"Continue\"...");
powershell.AddScript("$VerbosePreference=\"Continue\"");
powershell.Invoke();
Console.WriteLine("done");
Console.Write("Importing Workflow module...");
powershell.Commands.Clear();
//Import the module in to the PowerShell runspace. A XAML file could also be imported directly by using Import-Module.
powershell.AddCommand("Import-Module").AddArgument(moduleFile);
powershell.Invoke();
Console.WriteLine("done");
Console.Write("Creating job proxy...");
powershell.Commands.Clear();
powershell.AddCommand("Get-Proc").AddArgument("*");
PSJobProxy job = powershell.AsJobProxy();
Console.WriteLine("done");
Console.WriteLine();
Console.WriteLine("Using job proxy and performing operations...");
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
Console.WriteLine("Starting job...");
job.StartJob();
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
// use blocking enumerator to wait for objects until job finishes
job.Output.BlockingEnumerator = true;
foreach (PSObject o in job.Output)
{
Console.WriteLine(o.Properties["ProcessName"].Value.ToString());
}
// wait for a random time before attempting to stop job
Random random = new Random();
int time = random.Next(1, 10);
Console.Write("Sleeping for {0} seconds when job is running on another thread...", time);
System.Threading.Thread.Sleep(time * 1000);
Console.WriteLine("done");
Console.WriteLine("Stopping job...");
job.StopJob();
Console.WriteLine("State of Job :" + job.JobStateInfo.State.ToString());
Console.WriteLine();
job.Finished.WaitOne();
Console.WriteLine("Output from job");
Console.WriteLine("---------------");
foreach (PSObject o in job.Output)
{
Console.WriteLine(o.Properties["ProcessName"].Value.ToString());
}
Console.WriteLine();
Console.WriteLine("Verbose messages from job");
Console.WriteLine("-------------------------");
foreach (VerboseRecord v in job.Verbose)
{
Console.WriteLine(v.Message);
}
runspace.Close();
}
}
}