Share via


Importación e invocación de un flujo de trabajo de Windows PowerShell

Windows PowerShell 3, permite importar e invocar un flujo de trabajo empaquetado como un módulo de Windows PowerShell. Para obtener información sobre los módulos de Windows PowerShell, consulte Escritura de un módulo de Windows PowerShell.

La clase System.Management.Automation.Psjobproxyse usa como proxy del lado cliente para objetos de flujo de trabajo en el servidor. En el procedimiento siguiente se explica cómo usar un objeto System.Management.Automation.Psjobproxypara invocar un flujo de trabajo.

Crear un objeto PSJobProxy para ejecutar comandos de flujo de trabajo en un servidor remoto.

  1. Cree un objeto System.Management.Automation.Runspaces.Wsmanconnectioninfopara crear una conexión a un espacio de ejecución remoto.

  2. Establezca la propiedad System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* del objeto System.Management.Automation.Runspaces.Wsmanconnectioninfopara Microsoft.PowerShell.Workflow especificar un punto de conexión de Windows PowerShell.

  3. Cree un espacio de ejecución que use la conexión creada completando los pasos anteriores.

  4. Cree un objeto System.Management.Automation.Powershelly establezca su propiedad System.Management.Automation.Powershell.Runspace* en el espacio de ejecución creado en el paso anterior.

  5. Importe el módulo de flujo de trabajo y sus comandos en System.Management.Automation.Powershell.

  6. Cree un objeto System.Management.Automation.Psjobproxy y úselo para ejecutar comandos de flujo de trabajo en el servidor remoto.

Ejemplo

En el ejemplo de código siguiente se muestra cómo invocar un flujo de trabajo mediante Windows PowerShell.

En este ejemplo se requiere 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();
        }
    }
}