Compartilhar via


Importar e invocar um fluxo de trabalho do Windows PowerShell

Windows PowerShell 3, permite importar e invocar um fluxo de trabalho que é empacotado como um módulo de Windows PowerShell. Para obter informações sobre Windows PowerShell módulos, consulte Escrevendo um módulo de Windows PowerShell.

A classe System.Management.Automation.Psjobproxyé usada como um proxy do lado do cliente para objetos de fluxo de trabalho no servidor. O procedimento a seguir explica como usar um objeto System.Management.Automation.Psjobproxypara invocar um fluxo de trabalho.

Criando um objeto PSJobProxy para executar comandos de fluxo de trabalho em um servidor remoto.

  1. Crie um objeto System.Management.Automation.Runspaces.Wsmanconnectioninfopara criar uma conexão com um runspace remoto.

  2. Defina a propriedade System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* do objeto System.Management.Automation.Runspaces.Wsmanconnectioninfopara Microsoft.PowerShell.Workflow especificar um ponto de extremidade Windows PowerShell.

  3. Crie um runspace que use a conexão criada concluindo as etapas anteriores.

  4. Crie um objeto System.Management.Automation.Powershelle defina sua propriedade System.Management.Automation.Powershell.Runspace* para o runspace criado na etapa anterior.

  5. Importe o módulo de fluxo de trabalho e seus comandos para o System.Management.Automation.Powershell.

  6. Crie um objeto System.Management.Automation.Psjobproxy e use-o para executar comandos de fluxo de trabalho no servidor remoto.

Exemplo

O exemplo de código a seguir demonstra como invocar um fluxo de trabalho usando Windows PowerShell.

Este exemplo requer 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();
        }
    }
}