Importieren und Aufrufen eines Windows PowerShell-Workflows
Windows PowerShell 3 können Sie einen Workflow importieren und aufrufen, der als Windows PowerShell Modul verpackt ist. Informationen zu Windows PowerShell Modulen finden Sie unter Schreiben eines Windows PowerShell Moduls.
Die System.Management.Automation.Psjobproxy-Klassewird als clientseitiger Proxy für Workflowobjekte auf dem Server verwendet. Im folgenden Verfahren wird erläutert, wie Sie ein System.Management.Automation.Psjobproxy-Objektverwenden, um einen Workflow aufzurufen.
Erstellen eines PSJobProxy-Objekts zum Ausführen von Workflowbefehlen auf einem Remoteserver.
Erstellen Sie ein System.Management.Automation.Runspaces.Wsmanconnectioninfo-Objekt, um eine Verbindung mit einem Remote-Runspace zu erstellen.
Legen Sie die Eigenschaft "System.Management.Automation.Runspaces.Wsmanconnectioninfo.Shelluri*" der Eigenschaft "System.Management.Automation.Runspaces.Wsmanconnectioninfo" fest, um
Microsoft.PowerShell.Workflow
einen Windows PowerShell Endpunkt anzugeben.Erstellen Sie einen Runspace, der die Verbindung verwendet, die erstellt wurde, indem Sie die vorherigen Schritte ausführen.
Erstellen Sie ein System.Management.Automation.Powershell-Objekt, und legen Sie die Eigenschaft "System.Management.Automation.Powershell.Runspace* " auf den im vorherigen Schritt erstellten Runspace fest.
Importieren Sie das Workflowmodul und dessen Befehle in die Powershell "System.Management.Automation.Powershell".
Erstellen Sie ein System.Management.Automation.Psjobproxy-Objekt und verwenden Sie sie zum Ausführen von Workflowbefehlen auf dem Remoteserver.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie ein Workflow mithilfe von Windows PowerShell aufgerufen wird.
In diesem Beispiel ist Windows PowerShell 3 erforderlich.
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();
}
}
}