Windows PowerShell ワークフローをインポートして呼び出す
Windows PowerShell 3 では、Windows PowerShell モジュールとしてパッケージ化されたワークフローをインポートして呼び出すことができます。 Windows PowerShell モジュールの詳細については、「Windows PowerShell モジュールの記述」を参照してください。
System.Management.Automation.Psjobproxyクラスは、サーバー上のワークフロー オブジェクトのクライアント側プロキシとして使用されます。 次の手順では、 System.Management.Automation.Psjobproxyオブジェクトを使用してワークフローを呼び出す方法について説明します。
リモート サーバーでワークフロー コマンドを実行する PSJobProxy オブジェクトを作成する。
System.Management.Automation.Runspaces.Wsmanconnectioninfoオブジェクトを作成して、リモート実行空間への接続を作成します。
System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri* プロパティを System.Management.Automation.Runspaces.Wsmanconnectioninfoオブジェクトのプロパティに設定して
Microsoft.PowerShell.Workflow
、Windows PowerShell エンドポイントを指定します。前の手順を実行して作成した接続を使用する実行空間を作成します。
System.Management.Automation.Powershellオブジェクトを作成し、その System.Management.Automation.Powershell.Runspace* プロパティを前の手順で作成した実行空間に設定します。
ワークフロー モジュールとそのコマンドを System.Management.Automation.Powershell にインポートします。
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();
}
}
}