113 lines
4.9 KiB
C#
113 lines
4.9 KiB
C#
// <copyright file="Runspace09.cs" company="Microsoft Corporation">
|
|
// Copyright (c) 2009 Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// 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;
|
|
|
|
/// <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">This 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 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.
|
|
/// </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 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();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <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!");
|
|
}
|
|
}
|
|
}
|
|
} |