Dela via


Importera och anropa ett Windows PowerShell-arbetsflöde

Windows PowerShell 3 kan du importera och anropa ett arbetsflöde som paketeras som en Windows PowerShell modul. Information om Windows PowerShell moduler finns i Skriva en Windows PowerShell-modul.

Klassen System.Management.Automation.Psjobproxyanvänds som proxy på klientsidan för arbetsflödesobjekt på servern. Följande procedur beskriver hur du använder ett System.Management.Automation.Psjobproxy-objektför att anropa ett arbetsflöde.

Skapa ett PSJobProxy-objekt för att köra arbetsflödeskommandon på en fjärrserver.

  1. Skapa ett System.Management.Automation.Runspaces.Wsmanconnectioninfo-objektför att skapa en anslutning till ett fjärrkörningsutrymme.

  2. Ange egenskapen System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* för objektet System.Management.Automation.Runspaces.Wsmanconnectioninfoför att Microsoft.PowerShell.Workflow ange en Windows PowerShell slutpunkt.

  3. Skapa en runspace som använder anslutningen som skapades genom att slutföra föregående steg.

  4. Skapa ett System.Management.Automation.Powershell-objektoch ange egenskapen System.Management.Automation.Powershell.Runspace* till det runspace som skapades i föregående steg.

  5. Importera arbetsflödesmodulen och dess kommandon till System.Management.Automation.Powershell.

  6. Skapa ett System.Management.Automation.Psjobproxy-objekt och använd det för att köra arbetsflödeskommandon på fjärrservern.

Exempel

Följande kodexempel visar hur du anropar ett arbetsflöde med hjälp av Windows PowerShell.

Det här exemplet kräver 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();
        }
    }
}