// // 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.ObjectModel; 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 Runspace07 { /// /// This sample shows how to create a runspace and how to run /// commands using a PowerShell object. It builds a pipeline /// that runs the get-process cmdlet, which is piped to the measure-object /// cmdlet to count the number of processes running on the system. /// /// Parameter is not used. /// /// This sample demonstrates the following: /// 1. Creating a runspace using the RunspaceFactory class. /// 2. Creating a PowerShell object /// 3. Adding individual cmdlets to the PowerShell object. /// 4. Running the cmdlets synchronously. /// 5. Working with PSObject objects to extract properties /// from the objects returned by the cmdlets. /// private static void Main(string[] args) { Collection result; // Will hold the result // of running the cmdlets. // Create a runspace. We can not use the RunspaceInvoke class // because we need to get at the underlying runspace to // explicitly add the commands. Notice that no PSHost object is // supplied to the CreateRunspace method so the default host is // used. See the Host samples for more information on creating // your own custom host. using (Runspace myRunSpace = RunspaceFactory.CreateRunspace()) { myRunSpace.Open(); // Create a PowerShell object and specify the runspace. PowerShell powershell = PowerShell.Create(); powershell.Runspace = myRunSpace; // Use the using statement so we dispose of the PowerShell object // when we're done. using (powershell) { // Add the get-process cmdlet to the PowerShell object. Notice // we are specify the name of the cmdlet, not a script. powershell.AddCommand("get-process"); // Add the measure-object cmdlet to count the number // of objects being returned. Commands are always added to the end // of the pipeline. powershell.AddCommand("measure-object"); // Run the cmdlets synchronously and save the objects returned. result = powershell.Invoke(); } // Even after disposing of the pipeLine, we still need to set // the powershell variable to null so that the garbage collector // can clean it up. powershell = null; // Display the results of running the commands (checking that // everything is ok first. if (result == null || result.Count != 1) { throw new InvalidOperationException( "pipeline.Invoke() returned the wrong number of objects"); } PSMemberInfo count = result[0].Properties["Count"]; if (count == null) { throw new InvalidOperationException( "The object returned doesn't have a 'count' property"); } Console.WriteLine( "Runspace07: The get-process cmdlet returned {0} objects", count.Value); // Close the runspace to release any resources. myRunSpace.Close(); } System.Console.WriteLine("Hit any key to exit..."); System.Console.ReadKey(); } } }