Udostępnij za pośrednictwem


Importowanie i wywoływanie przepływu pracy programu Windows PowerShell

Windows PowerShell 3 umożliwia importowanie i wywoływanie przepływu pracy spakowanego jako moduł Windows PowerShell. Aby uzyskać informacje o modułach Windows PowerShell, zobacz Pisanie modułu Windows PowerShell.

Klasa System.Management.Automation.Psjobproxyjest używana jako serwer proxy po stronie klienta dla obiektów przepływu pracy na serwerze. Poniższa procedura wyjaśnia, jak wywołać przepływ pracy za pomocą obiektu System.Management.Automation.Psjobproxy.

Tworzenie obiektu PSJobProxy w celu wykonywania poleceń przepływu pracy na serwerze zdalnym.

  1. Utwórz obiekt System.Management.Automation.Runspaces.Wsmanconnectioninfo, aby utworzyć połączenie z zdalną przestrzenią uruchamiania.

  2. Ustaw właściwość System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* obiektu System.Management.Automation.Runspaces.Wsmanconnectioninfo, aby Microsoft.PowerShell.Workflow określić punkt końcowy Windows PowerShell.

  3. Utwórz przestrzeń uruchomieniową, która używa połączenia utworzonego przez wykonanie poprzednich kroków.

  4. Utwórz obiekt System.Management.Automation.Powershelli ustaw jego właściwość System.Management.Automation.Powershell.Runspace* na przestrzeń uruchomieniową utworzoną w poprzednim kroku.

  5. Zaimportuj moduł przepływu pracy i jego polecenia do programu System.Management.Automation.Powershell.

  6. Utwórz obiekt System.Management.Automation.Psjobproxy i użyj go do wykonywania poleceń przepływu pracy na serwerze zdalnym.

Przykład

W poniższym przykładzie kodu pokazano, jak wywołać przepływ pracy przy użyciu Windows PowerShell.

Ten przykład wymaga 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();
        }
    }
}