Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato ukázka ukazuje, jak přidat skript do kanálu System.Management.Automation.PowerShell objektu a jak skript spustit asynchronně. Události se používají ke zpracování výstupu skriptu.
Požadavky
Tato ukázka vyžaduje Prostředí Windows PowerShell 2.0.
Demonstruje
Tato ukázka ukazuje následující:
Vytvoření objektu System.Management.Automation.PowerShell, který používá runspace.
Přidání skriptu kanálu objektu System.Management.Automation.PowerShell.
Asynchronní spuštění kanálu pomocí metody System.Management.Automation.PowerShell.BeginInvoke*.
Použití událostí System.Management.Automation.PowerShell objektu ke zpracování výstupu skriptu.
Pomocí metody System.Management.Automation.PowerShell.Stop* přerušíte vyvolání kanálu.
Příklad
Tato ukázka spustí skript, který vygeneruje čísla od 1 do 10 se zpožděním mezi jednotlivými čísly. Skript se spouští asynchronně a události se používají ke zpracování výstupu.
namespace Microsoft.Samples.PowerShell.Runspaces
{
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using PowerShell = System.Management.Automation.PowerShell;
/// <summary>
/// This class contains the Main entry point for this host application.
/// </summary>
internal class Runspace09
{
/// <summary>
/// This sample shows how to use a PowerShell object to run a
/// script that generates the numbers from 1 to 10 with delays
/// between each number. The pipeline of the PowerShell object
/// is run asynchronously and events are used to handle the output.
/// </summary>
/// <param name="args">The parameter is not used.</param>
/// <remarks>
/// This sample demonstrates the following:
/// 1. Creating a PowerShell object.
/// 2. Adding a script to the pipeline of the PowerShell object.
/// 3. Using the BeginInvoke method to run the pipeline asynchronously.
/// 4. Using the events of the PowerShell object to process the
/// output of the script.
/// 5. Using the PowerShell.Stop() method to interrupt the invocation of
/// the pipeline.
/// </remarks>
private static void Main(string[] args)
{
Console.WriteLine("Print the numbers from 1 to 10. Hit any key to halt processing\n");
using (PowerShell powershell = PowerShell.Create())
{
// Add a script to the PowerShell object. The script generates the
// numbers from 1 to 10 in half second intervals.
powershell.AddScript("1..10 | foreach {$_ ; Start-Sleep -Milli 500}");
// Add the event handlers. If we did not care about hooking the DataAdded
// event, we would let BeginInvoke create the output stream for us.
PSDataCollection<PSObject> output = new PSDataCollection<PSObject>();
output.DataAdded += new EventHandler<DataAddedEventArgs>(Output_DataAdded);
powershell.InvocationStateChanged += new EventHandler<PSInvocationStateChangedEventArgs>(Powershell_InvocationStateChanged);
// Invoke the pipeline asynchronously.
IAsyncResult asyncResult = powershell.BeginInvoke<PSObject, PSObject>(null, output);
// Wait for things to happen. If the user hits a key before the
// script has completed, then call the PowerShell Stop() method
// to halt processing.
Console.ReadKey();
if (powershell.InvocationStateInfo.State != PSInvocationState.Completed)
{
// Stop the invocation of the pipeline.
Console.WriteLine("\nStopping the pipeline!\n");
powershell.Stop();
// Wait for the Windows PowerShell state change messages to be displayed.
System.Threading.Thread.Sleep(500);
Console.WriteLine("\nPress a key to exit");
Console.ReadKey();
}
}
}
/// <summary>
/// The output data added event handler. This event is called when
/// data is added to the output pipe. It reads the data that is
/// available and displays it on the console.
/// </summary>
/// <param name="sender">The output pipe this event is associated with.</param>
/// <param name="e">Parameter is not used.</param>
private static void Output_DataAdded(object sender, DataAddedEventArgs e)
{
PSDataCollection<PSObject> myp = (PSDataCollection<PSObject>)sender;
Collection<PSObject> results = myp.ReadAll();
foreach (PSObject result in results)
{
Console.WriteLine(result.ToString());
}
}
/// <summary>
/// This event handler is called when the pipeline state is changed.
/// If the state change is to Completed, the handler issues a message
/// asking the user to exit the program.
/// </summary>
/// <param name="sender">This parameter is not used.</param>
/// <param name="e">The PowerShell state information.</param>
private static void Powershell_InvocationStateChanged(object sender, PSInvocationStateChangedEventArgs e)
{
Console.WriteLine("PowerShell object state changed: state: {0}\n", e.InvocationStateInfo.State);
if (e.InvocationStateInfo.State == PSInvocationState.Completed)
{
Console.WriteLine("Processing completed, press a key to exit!");
}
}
}
}