/********************************************************************++ Copyright (c) Microsoft Corporation. All rights reserved. --********************************************************************/ namespace System.Management.Automation { using System; using System.Collections; using System.Collections.ObjectModel; using System.Management.Automation.Runspaces; /// /// Defines a class which allows simple execution of commands from CLR languages /// public class RunspaceInvoke : IDisposable { #region constructors /// /// Runspace on which commands are invoked /// private Runspace _runspace; /// /// Create a RunspaceInvoke for invoking commands. This uses /// a runspace with default PSSnapins. /// public RunspaceInvoke() { RunspaceConfiguration rc = RunspaceConfiguration.Create(); _runspace = RunspaceFactory.CreateRunspace(rc); _runspace.Open(); if (Runspace.DefaultRunspace == null) { Runspace.DefaultRunspace = _runspace; } } /// /// Creates a RunspaceInvoke for invoking commands. Underlying Runspace is created using /// specified RunspaceConfiguration /// /// RunspaceConfiguration used for creating the runspace /// /// /// Thrown when runspaceConfiguration is null /// public RunspaceInvoke(RunspaceConfiguration runspaceConfiguration) { if (runspaceConfiguration == null) { throw PSTraceSource.NewArgumentNullException("runspaceConfiguration"); } _runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); _runspace.Open(); if (Runspace.DefaultRunspace == null) { Runspace.DefaultRunspace = _runspace; } } /// /// Creates a RunspaceInvoke for invoking commands. Underlying Runspace is created using the /// specified console file. /// /// Console file used for creating the underlying /// runspace. /// /// Thrown when consoleFilePath is null /// /// /// Thrown when errors occurs in loading one or more PSSnapins. /// public RunspaceInvoke(string consoleFilePath) { if (consoleFilePath == null) { throw PSTraceSource.NewArgumentNullException("consoleFilePath"); } PSConsoleLoadException warnings; RunspaceConfiguration rc = RunspaceConfiguration.Create(consoleFilePath, out warnings); if (warnings != null) { throw warnings; } _runspace = RunspaceFactory.CreateRunspace(rc); _runspace.Open(); if (Runspace.DefaultRunspace == null) { Runspace.DefaultRunspace = _runspace; } } /// /// Create RunspaceInvoke for invoking command in specified /// runspace. /// /// /// Runspace must be opened state public RunspaceInvoke(Runspace runspace) { if (runspace == null) { throw PSTraceSource.NewArgumentNullException("runspace"); } _runspace = runspace; if (Runspace.DefaultRunspace == null) { Runspace.DefaultRunspace = _runspace; } } #endregion constructors #region invoke /// /// Invoke the specified script /// /// msh script to invoke /// Output of invocation public Collection Invoke(string script) { return Invoke(script, null); } /// /// Invoke the specified script and passes specified input to the script /// /// msh script to invoke /// input to script /// Output of invocation public Collection Invoke(string script, IEnumerable input) { if (_disposed == true) { throw PSTraceSource.NewObjectDisposedException("runspace"); } if (script == null) { throw PSTraceSource.NewArgumentNullException("script"); } Pipeline p = _runspace.CreatePipeline(script); return p.Invoke(input); } /// /// Invoke the specified script and passes specified input to the script. /// /// msh script to invoke /// input to script /// this gets errors from script /// output of invocation /// /// is the non-terminating error stream /// from the command. /// In this release, the objects read from this PipelineReader /// are PSObjects wrapping ErrorRecords. /// public Collection Invoke(string script, IEnumerable input, out IList errors) { if (_disposed == true) { throw PSTraceSource.NewObjectDisposedException("runspace"); } if (script == null) { throw PSTraceSource.NewArgumentNullException("script"); } Pipeline p = _runspace.CreatePipeline(script); Collection output = p.Invoke(input); // 2004/06/30-JonN was ReadAll() which was non-blocking errors = p.Error.NonBlockingRead(); return output; } #endregion invoke #region IDisposable Members /// /// Set to true when object is disposed /// private bool _disposed; /// /// Dispose underlying Runspace /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// Protected dispose which can be overridden by derived classes. /// /// protected virtual void Dispose(bool disposing) { if (_disposed == false) { if (disposing) { _runspace.Close(); _runspace = null; } } _disposed = true; } #endregion IDisposable Members } }