다음을 통해 공유


Windows PowerShell 워크플로 가져오기 및 호출

Windows PowerShell 3을 사용하면 Windows PowerShell 모듈로 패키지된 워크플로를 가져오고 호출할 수 있습니다. Windows PowerShell 모듈에 대한 자세한 내용은 Windows PowerShell 모듈 작성을 참조하세요.

System.Management.Automation.Psjobproxy클래스는 서버의 워크플로 개체에 대한 클라이언트 쪽 프록시로 사용됩니다. 다음 절차에서는 System.Management.Automation.Psjobproxy개체를 사용하여 워크플로를 호출하는 방법을 설명합니다.

원격 서버에서 워크플로 명령을 실행하는 PSJobProxy 개체를 만듭니다.

  1. System.Management.Automation.Runspaces.Wsmanconnectioninfo개체를 만들어 원격 Runspace에 대한 연결을 만듭니다.

  2. System.Management.Automation.Runspaces.Wsmanconnectioninfo 개체의 System.Management.Automation.Runspaces.Wsmanconnectioninfo 속성을 설정하여 Microsoft.PowerShell.Workflow Windows PowerShell 엔드포인트를 지정합니다.

  3. 이전 단계를 완료하여 만든 연결을 사용하는 Runspace를 만듭니다.

  4. System.Management.Automation.Powershell개체를 만들고 System.Management.Automation.Powershell.Runspace* 속성을 이전 단계에서 만든 Runspace로 설정합니다.

  5. 워크플로 모듈 및 해당 명령을 System.Management.Automation.Powershell로 가져옵니다.

  6. System.Management.Automation.Psjobproxy 개체를 만들고 이를 사용하여 원격 서버에서 워크플로 명령을 실행합니다.

예제

다음 코드 예제에서는 Windows PowerShell 사용하여 워크플로를 호출하는 방법을 보여 줍니다.

이 예제에는 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();
        }
    }
}