/// <summary> /// Executes a piece of text as a script synchronously using the options provided. /// </summary> /// <param name="script">The script to evaluate.</param> /// <param name="useNewScope">If true, evaluate the script in its own scope. /// If false, the script will be evaluated in the current scope i.e. it will be "dotted"</param> /// <param name="writeToPipeline">If set to Output, all output will be streamed /// to the output pipe of the calling cmdlet. If set to None, the result will be returned /// to the caller as a collection of PSObjects. No other flags are supported at this time and /// will result in an exception if used.</param> /// <param name="input">The list of objects to use as input to the script.</param> /// <param name="args">The array of arguments to the command.</param> /// <returns>A collection of MshCobjects generated by the script. This will be /// empty if output was redirected.</returns> /// <exception cref="ParseException">Thrown if there was a parsing error in the script.</exception> /// <exception cref="RuntimeException">Represents a script-level exception.</exception> /// <exception cref="NotImplementedException">Thrown if any redirect other than output is attempted.</exception> /// <exception cref="FlowControlException"></exception> public Collection <PSObject> InvokeScript(string script, bool useNewScope, PipelineResultTypes writeToPipeline, IList input, params object[] args) { if (script == null) { throw new ArgumentNullException(nameof(script)); } // Compile the script text into an executable script block. ScriptBlock sb = ScriptBlock.Create(_context, script); return(InvokeScript(sb, useNewScope, writeToPipeline, input, args)); }
private Collection <PSObject> InvokeScript(ScriptBlock sb, bool useNewScope, PipelineResultTypes writeToPipeline, IList input, params object[] args) { if (_cmdlet != null) { _cmdlet.ThrowIfStopping(); } Cmdlet cmdletToUse = null; ScriptBlock.ErrorHandlingBehavior errorHandlingBehavior = ScriptBlock.ErrorHandlingBehavior.WriteToExternalErrorPipe; // Check if they want output if ((writeToPipeline & PipelineResultTypes.Output) == PipelineResultTypes.Output) { cmdletToUse = _cmdlet; writeToPipeline &= (~PipelineResultTypes.Output); } // Check if they want error if ((writeToPipeline & PipelineResultTypes.Error) == PipelineResultTypes.Error) { errorHandlingBehavior = ScriptBlock.ErrorHandlingBehavior.WriteToCurrentErrorPipe; writeToPipeline &= (~PipelineResultTypes.Error); } if (writeToPipeline != PipelineResultTypes.None) { // The only output types are Output and Error. throw PSTraceSource.NewNotImplementedException(); } // If the cmdletToUse is not null, then the result of the evaluation will be // streamed out the output pipe of the cmdlet. object rawResult; if (cmdletToUse != null) { sb.InvokeUsingCmdlet( contextCmdlet: cmdletToUse, useLocalScope: useNewScope, errorHandlingBehavior: errorHandlingBehavior, dollarUnder: AutomationNull.Value, input: input, scriptThis: AutomationNull.Value, args: args); rawResult = AutomationNull.Value; } else { rawResult = sb.DoInvokeReturnAsIs( useLocalScope: useNewScope, errorHandlingBehavior: errorHandlingBehavior, dollarUnder: AutomationNull.Value, input: input, scriptThis: AutomationNull.Value, args: args); } if (rawResult == AutomationNull.Value) { return(new Collection <PSObject>()); } // If the result is already a collection of PSObjects, just return it... Collection <PSObject> result = rawResult as Collection <PSObject>; if (result != null) { return(result); } result = new Collection <PSObject>(); IEnumerator list = null; list = LanguagePrimitives.GetEnumerator(rawResult); if (list != null) { while (list.MoveNext()) { object val = list.Current; result.Add(LanguagePrimitives.AsPSObjectOrNull(val)); } } else { result.Add(LanguagePrimitives.AsPSObjectOrNull(rawResult)); } return(result); }
private Collection<PSObject> InvokeScript(ScriptBlock sb, bool useNewScope, PipelineResultTypes writeToPipeline, IList input, params object[] args) { if (null != _cmdlet) _cmdlet.ThrowIfStopping(); Cmdlet cmdletToUse = null; ScriptBlock.ErrorHandlingBehavior errorHandlingBehavior = ScriptBlock.ErrorHandlingBehavior.WriteToExternalErrorPipe; // Check if they want output if ((writeToPipeline & PipelineResultTypes.Output) == PipelineResultTypes.Output) { cmdletToUse = _cmdlet; writeToPipeline &= (~PipelineResultTypes.Output); } // Check if they want error if ((writeToPipeline & PipelineResultTypes.Error) == PipelineResultTypes.Error) { errorHandlingBehavior = ScriptBlock.ErrorHandlingBehavior.WriteToCurrentErrorPipe; writeToPipeline &= (~PipelineResultTypes.Error); } if (writeToPipeline != PipelineResultTypes.None) { // The only output types are Output and Error. throw PSTraceSource.NewNotImplementedException(); } // If the cmdletToUse is not null, then the result of the evaluation will be // streamed out the output pipe of the cmdlet. object rawResult; if (cmdletToUse != null) { sb.InvokeUsingCmdlet( contextCmdlet: cmdletToUse, useLocalScope: useNewScope, errorHandlingBehavior: errorHandlingBehavior, dollarUnder: AutomationNull.Value, input: input, scriptThis: AutomationNull.Value, args: args); rawResult = AutomationNull.Value; } else { rawResult = sb.DoInvokeReturnAsIs( useLocalScope: useNewScope, errorHandlingBehavior: errorHandlingBehavior, dollarUnder: AutomationNull.Value, input: input, scriptThis: AutomationNull.Value, args: args); } if (rawResult == AutomationNull.Value) { return new Collection<PSObject>(); } // If the result is already a collection of PSObjects, just return it... Collection<PSObject> result = rawResult as Collection<PSObject>; if (result != null) return result; result = new Collection<PSObject>(); IEnumerator list = null; list = LanguagePrimitives.GetEnumerator(rawResult); if (list != null) { while (list.MoveNext()) { object val = list.Current; result.Add(LanguagePrimitives.AsPSObjectOrNull(val)); } } else { result.Add(LanguagePrimitives.AsPSObjectOrNull(rawResult)); } return result; }
/// <summary> /// Executes a piece of text as a script synchronously using the options provided. /// </summary> /// <param name="script">The script to evaluate.</param> /// <param name="useNewScope">If true, evaluate the script in its own scope. /// If false, the script will be evaluated in the current scope i.e. it will be "dotted"</param> /// <param name="writeToPipeline">If set to Output, all output will be streamed /// to the output pipe of the calling cmdlet. If set to None, the result will be returned /// to the caller as a collection of PSObjects. No other flags are supported at this time and /// will result in an exception if used.</param> /// <param name="input">The list of objects to use as input to the script.</param> /// <param name="args">The array of arguments to the command.</param> /// <returns>A collection of MshCobjects generated by the script. This will be /// empty if output was redirected.</returns> /// <exception cref="ParseException">Thrown if there was a parsing error in the script.</exception> /// <exception cref="RuntimeException">Represents a script-level exception</exception> /// <exception cref="NotImplementedException">Thrown if any redirect other than output is attempted</exception> /// <exception cref="FlowControlException"></exception> public Collection<PSObject> InvokeScript(string script, bool useNewScope, PipelineResultTypes writeToPipeline, IList input, params object[] args) { if (script == null) throw new ArgumentNullException("script"); // Compile the script text into an executable script block. ScriptBlock sb = ScriptBlock.Create(_context, script); return InvokeScript(sb, useNewScope, writeToPipeline, input, args); }