public Collection <object> Execute(params string[] commands) { if (LastRunspace != null) { LastRunspace.Close(); } LastRunspace = RunspaceFactory.CreateRunspace(); LastRunspace.Open(); LoadCmdletBinary(); return(ExecuteInExistingRunspace(commands)); }
public Collection <object> ExecuteInExistingRunspace(params string[] commands) { Collection <PSObject> results = null; LastResults = new Collection <object>(); LastErrors = new Collection <ErrorRecord>(); using (var pipeline = LastRunspace.CreatePipeline()) { var script = JoinCommands(_preExecutionCmds) + JoinCommands(commands) + JoinCommands(_postExecutionCmds); pipeline.Commands.AddScript(script, false); results = pipeline.Invoke(); LastErrors = new Collection <ErrorRecord>( (from errObj in pipeline.Error.NonBlockingRead() where errObj is PSObject select((PSObject)errObj).BaseObject as ErrorRecord ).ToList() ); } foreach (var curPSObject in results) { if (curPSObject == null) { LastResults.Add(null); } else { LastResults.Add(curPSObject.BaseObject); } } if (LastErrors.Count > 0) { throw new ShellExecutionHasErrorsException(LastErrors); } return(LastResults); }
private void LoadCmdletBinary() { bool isWindows = Environment.OSVersion.Platform == PlatformID.Win32NT; string path = new Uri(typeof(CmisCmdlets.CmisCommandBase).Assembly.CodeBase).LocalPath; // with real Powershell we use Import-Module to avoid installation of the SnapIn string cmd = isWindows ? "Import-Module '{0}'" : "Add-PSSnapIn '{0}'"; using (var pipeline = LastRunspace.CreatePipeline()) { pipeline.Commands.AddScript(String.Format(cmd, path)); try { pipeline.Invoke(); } catch (MethodInvocationException e) { throw new RuntimeException(String.Format( "Failed to import module '{0}'. Didn't you build it?", path), e); } } }