Sdílet prostřednictvím


Import a vyvolání pracovního postupu Windows PowerShellu

Windows PowerShell 3 umožňuje importovat a vyvolat pracovní postup zabalený jako modul Windows PowerShell. Informace o modulech Windows PowerShell naleznete v tématu Vytvoření modulu Windows PowerShell.

Třída System.Management.Automation.Psjobproxyse používá jako proxy na straně klienta pro objekty pracovního postupu na serveru. Následující postup vysvětluje, jak pomocí objektu System.Management.Automation.Psjobproxyvyvolat pracovní postup.

Vytvoření objektu PSJobProxy pro spouštění příkazů pracovního postupu na vzdáleném serveru

  1. Vytvořte objekt System.Management.Automation.Runspaces.Wsmanconnectioninfopro vytvoření připojení ke vzdálenému prostředí Runspace.

  2. Nastavte vlastnost System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* objektu System.Management.Automation.Runspaces.Wsmanconnectioninfotak, aby Microsoft.PowerShell.Workflow určila koncový bod Windows PowerShell.

  3. Vytvořte runspace, který používá připojení vytvořené dokončením předchozích kroků.

  4. Vytvořte objekt System.Management.Automation.Powershella nastavte jeho vlastnost System.Management.Automation.Powershell.Runspace* na runspace vytvořený v předchozím kroku.

  5. Importujte modul pracovního postupu a jeho příkazy do Prostředí System.Management.Automation.Powershell.

  6. Vytvořte objekt System.Management.Automation.Psjobproxy a použijte ho ke spouštění příkazů pracovního postupu na vzdáleném serveru.

Příklad

Následující příklad kódu ukazuje, jak vyvolat pracovní postup pomocí Windows PowerShell.

Tento příklad vyžaduje 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();
        }
    }
}