Condividi tramite


Importazione e richiamo di un flusso di lavoro di Windows PowerShell

Windows PowerShell 3 consente di importare e richiamare un flusso di lavoro pacchetto come modulo Windows PowerShell. Per informazioni sui moduli Windows PowerShell, vedere Scrittura di un modulo Windows PowerShell.

La classe System.Management.Automation.Psjobproxyviene usata come proxy lato client per gli oggetti flusso di lavoro nel server. La procedura seguente illustra come usare un oggetto System.Management.Automation.Psjobproxyper richiamare un flusso di lavoro.

Creazione di un oggetto PSJobProxy per eseguire comandi del flusso di lavoro in un server remoto.

  1. Creare un oggetto System.Management.Automation.Runspaces.Wsmanconnectioninfoper creare una connessione a un runspace remoto.

  2. Impostare la proprietà System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* dell'oggetto System.Management.Automation.Runspaces.Wsmanconnectioninfoper Microsoft.PowerShell.Workflow specificare un endpoint Windows PowerShell.

  3. Creare uno spazio di esecuzione che usa la connessione creata completando i passaggi precedenti.

  4. Creare un oggetto System.Management.Automation.Powershelle impostare la proprietà System.Management.Automation.Powershell.Runspace* sullo spazio di esecuzione creato nel passaggio precedente.

  5. Importare il modulo del flusso di lavoro e i relativi comandi in System.Management.Automation.Powershell.

  6. Creare un oggetto System.Management.Automation.Psjobproxy e usarlo per eseguire i comandi del flusso di lavoro nel server remoto.

Esempio

Nell'esempio di codice seguente viene illustrato come richiamare un flusso di lavoro usando Windows PowerShell.

Questo esempio richiede 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();
        }
    }
}