/********************************************************************++
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
}
}