Run Powershell script from XSharper script
<?xml version="1.0" encoding="utf-8"?>
<xsharper xmlns="http://www.xsharper.com/schemas/1.0">
<reference name="System.Management.Automation" withTypes="1" />
<?ht using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;
[XS.XsType("powershell")]
public class PowerShell : XSharper.Core.StaticValueFromFileBase
{
/// Where to output the subroutine value.
public string OutTo { get; set; }
/// Input collection
public object Input { get; set; }
/// Call isolation
public XS.CallIsolation Isolation { get; set; }
public PowerShell()
{
Isolation = XS.CallIsolation.High;
}
public override object Execute()
{
object x=base.Execute();
if (x != null)
return x;
var s = Context.Transform(Input, Transform);
if (s != null && !(s is System.Collections.IEnumerable))
s = new[] {s};
object ret = execInternal(GetTransformedValueStr(), s, (Isolation == XS.CallIsolation.High)?null:Context);
Context.OutTo(OutTo, ret);
return null;
}
static public object Exec(string script)
{
return execInternal(script, null, null);
}
static public object Exec(string script, object input)
{
return execInternal(script, input, null);
}
static private object execInternal(string script, object input, IEnumerable<XS.Var> vars)
{
MyHost host = new MyHost(XS.ScriptContextScope.Current);
using (var runspace = RunspaceFactory.CreateRunspace(host))
{
runspace.Open();
if (vars!=null)
foreach (XS.Var v in vars)
runspace.SessionStateProxy.SetVariable(v.Name, v.Value);
var ie = input as System.Collections.IEnumerable;
using (Pipeline pipeline = runspace.CreatePipeline())
{
pipeline.Commands.AddScript(script);
return (ie == null) ? pipeline.Invoke() : pipeline.Invoke(ie);
}
}
}
#region -- internal --
class MyHost : PSHost
{
public MyHost(XS.ScriptContext c) { _c = c; _ui = new UserInterface(c); }
public override void SetShouldExit(int exitCode) { throw new XS.ScriptTerminateException(exitCode); }
public override void EnterNestedPrompt() { throw new NotImplementedException(); }
public override void ExitNestedPrompt() { throw new NotImplementedException(); }
public override void NotifyBeginApplication() { }
public override void NotifyEndApplication() { }
public override string Name { get { return (_c.Script == null || string.IsNullOrEmpty(_c.Script.Id)) ? "XSharper" : _c.Script.Id; } }
public override Version Version
{
get
{
if (_c.Script != null && _c.Script.VersionInfo != null)
{
var s = _c.TransformStr(_c.Script.VersionInfo.Version, _c.Script.VersionInfo.Transform);
if (!string.IsNullOrEmpty(s))
return new Version(s);
}
return new Version(0, 0, 0, 0);
}
}
public override Guid InstanceId { get { return _myId; } }
public override PSHostUserInterface UI { get { return _ui; } }
public override CultureInfo CurrentCulture { get { return _originalCultureInfo; } }
public override CultureInfo CurrentUICulture { get { return _originalUICultureInfo; } }
private readonly XS.ScriptContext _c;
private readonly CultureInfo _originalCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
private readonly CultureInfo _originalUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture;
private readonly Guid _myId = Guid.NewGuid();
private readonly PSHostUserInterface _ui;
}
class RawUi : PSHostRawUserInterface
{
private XS.ScriptContext _c;
public RawUi(XS.ScriptContext scriptContext) { _c = scriptContext; }
public override KeyInfo ReadKey(ReadKeyOptions options)
{
if (!Console.KeyAvailable)
{
_c.CheckAbort();
System.Threading.Thread.Sleep(10);
}
ConsoleKeyInfo k = Console.ReadKey((options & ReadKeyOptions.NoEcho) == ReadKeyOptions.NoEcho);
ControlKeyStates ks = 0;
if ((k.Modifiers & ConsoleModifiers.Alt) == ConsoleModifiers.Alt)
ks |= ControlKeyStates.LeftAltPressed;
if ((k.Modifiers & ConsoleModifiers.Control) == ConsoleModifiers.Control)
ks |= ControlKeyStates.LeftAltPressed;
if ((k.Modifiers & ConsoleModifiers.Shift) == ConsoleModifiers.Shift)
ks |= ControlKeyStates.ShiftPressed;
if (Console.CapsLock)
ks |= ControlKeyStates.CapsLockOn;
return new KeyInfo((int)k.Key, k.KeyChar, ks, false);
}
public override void FlushInputBuffer() { }
public override void SetBufferContents(Coordinates origin, BufferCell[,] contents) { throw new NotImplementedException(); }
public override void SetBufferContents(Rectangle rectangle, BufferCell fill) { throw new NotImplementedException(); }
public override BufferCell[,] GetBufferContents(Rectangle rectangle) { throw new NotImplementedException(); }
public override void ScrollBufferContents(Rectangle source, Coordinates destination, Rectangle clip, BufferCell fill) { throw new NotImplementedException(); }
public override ConsoleColor ForegroundColor { get { return Console.ForegroundColor; } set { } }
public override ConsoleColor BackgroundColor { get { return Console.BackgroundColor; } set { } }
public override Coordinates CursorPosition { get { return new Coordinates(Console.CursorLeft, Console.CursorTop); } set { } }
public override Coordinates WindowPosition { get { return new Coordinates(Console.WindowLeft, Console.WindowTop); } set { } }
public override int CursorSize { get { return Console.CursorSize; } set { Console.CursorSize = value; } }
public override Size BufferSize
{
get
{
return new Size(XS.Utils.HasRealConsole ? Console.BufferWidth : 120, XS.Utils.HasRealConsole ? Console.BufferHeight : 60);
}
set
{
Console.BufferHeight = value.Height;
Console.BufferWidth = value.Width;
}
}
public override Size WindowSize
{
get { return new Size(Console.WindowWidth, Console.WindowHeight); }
set
{
Console.WindowHeight = value.Height;
Console.WindowWidth = value.Width;
}
}
public override Size MaxWindowSize { get { return new Size(Console.LargestWindowWidth, Console.LargestWindowHeight); } }
public override Size MaxPhysicalWindowSize { get { return MaxWindowSize; } }
public override bool KeyAvailable { get { return Console.KeyAvailable; } }
public override string WindowTitle { get { return Console.Title; } set { Console.Title = WindowTitle; } }
}
class UserInterface : PSHostUserInterface
{
private PSHostRawUserInterface _rawUi;
private XS.ScriptContext _c;
public UserInterface(XS.ScriptContext scriptContext)
{
_c = scriptContext;
_rawUi = new RawUi(scriptContext);
}
public override string ReadLine()
{
return XS.Utils.HasRealConsole ? Console.ReadLine() : null;
}
public override System.Security.SecureString ReadLineAsSecureString()
{
if (!XS.Utils.HasRealConsole)
return null;
System.Security.SecureString r = new System.Security.SecureString();
while (true)
{
while (!Console.KeyAvailable)
{
_c.CheckAbort();
System.Threading.Thread.Sleep(10);
}
ConsoleKeyInfo info = Console.ReadKey(true);
if (info.Key == ConsoleKey.Enter)
break;
if (info.Key != ConsoleKey.Backspace)
{
r.AppendChar(info.KeyChar);
_c.Write('*');
}
else
{
if (r.Length > 0)
{
r.RemoveAt(r.Length - 1);
_c.Write("\b \b");
}
}
}
_c.WriteLine();
return r;
}
public override void Write(string value) { _c.Write(value); }
public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value) { _c.Write(value); }
public override void WriteLine(string value) { _c.WriteLine(value); }
public override void WriteErrorLine(string value) { _c.Error.WriteLine(value); }
public override void WriteDebugLine(string message) { _c.Debug.WriteLine(message); }
public override void WriteProgress(long sourceId, ProgressRecord record) { _c.OnProgress(record.PercentComplete, record.CurrentOperation); }
public override void WriteVerboseLine(string message) { _c.Info.WriteLine(message); }
public override void WriteWarningLine(string message) { _c.Info.WriteLine(message); }
public override Dictionary<string, PSObject> Prompt(string caption, string message, Collection<FieldDescription> descriptions) { throw new NotImplementedException(); }
public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName) { throw new NotImplementedException(); }
public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName, PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options) { throw new NotImplementedException(); }
public override int PromptForChoice(string caption, string message, Collection<ChoiceDescription> choices, int defaultChoice) { throw new NotImplementedException(); }
public override PSHostRawUserInterface RawUI { get { return _rawUi; } }
}
#endregion
}
?>
</xsharper>