// // Copyright (c) 2009 Microsoft Corporation. All rights reserved. // // DISCLAIMER OF WARRANTY: The software is licensed “as-is.” You // bear the risk of using it. Microsoft gives no express warranties, // guarantees or conditions. You may have additional consumer rights // under your local laws which this agreement cannot change. To the extent // permitted under your local laws, Microsoft excludes the implied warranties // of merchantability, fitness for a particular purpose and non-infringement. 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; /// /// This class contains the Main entry point for this host application. /// internal class Runspace09 { /// /// 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. /// /// This parameter is not used. /// /// 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 asynchronosly. /// 4. Using the events of the PowerShell object to process the /// output of the script. /// 5. Using the PowerShell.Stop() method to interrupt an executing pipeline. /// 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 output = new PSDataCollection(); output.DataAdded += new EventHandler(Output_DataAdded); powershell.InvocationStateChanged += new EventHandler(Powershell_InvocationStateChanged); // Invoke the pipeline asynchronously. IAsyncResult asyncResult = powershell.BeginInvoke(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 execution 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(); } } } /// /// 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. /// /// The output pipe this event is associated with. /// Parameter is not used. private static void Output_DataAdded(object sender, DataAddedEventArgs e) { PSDataCollection myp = (PSDataCollection)sender; Collection results = myp.ReadAll(); foreach (PSObject result in results) { Console.WriteLine(result.ToString()); } } /// /// 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. /// /// This parameter is not used. /// The PowerShell state information. 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!"); } } } }