in src/TestFramework/Core/Adapters/PowerShellAdapterProxy.cs [334:429]
private PSParameterBuilder InvokeScript(string path, MethodInfo targetMethod, object[] args, string helpMessage)
{
//the patameter builder to handle all parameters
PSParameterBuilder builder = null;
//use the Dot operation in PowerShell to make all variables can be accessed in whole runspace.
string scriptContent = string.Format(". \"{0}\"", Path.GetFullPath(path));
//call static method, and create the instance of runspace type
Runspace runspace = RunspaceFactory.CreateRunspace();
//open run space
runspace.Open();
//call runspace.CreatePipeline to create an instance of Pipeline
Pipeline pipeline = runspace.CreatePipeline();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
//set execution policy for Windows in order to load and run local script files
pipeline.Commands.AddScript("Set-ExecutionPolicy -Scope Process RemoteSigned");
}
pipeline.Commands.AddScript(scriptContent);
SessionStateProxy sessionStateProxy = runspace.SessionStateProxy;
//set current location to the folder containing the script
sessionStateProxy.Path.SetLocation(Path.GetDirectoryName(path));
//set variables which can be used in PowerShell script
SetPTFVariables(sessionStateProxy);
//set all parameters as variables which can be used
//by users directly in the PowerShell script
builder = new PSParameterBuilder(targetMethod);
builder.SetAllParametersAsVariables(sessionStateProxy, args, helpMessage);
try
{
if (builder != null)
{
//invoke script and get the return value and out/ref parameters
if (builder.HasRetValue)
{
Collection<PSObject> returnValueCollection = pipeline.Invoke();
//get return value object
KeyValuePair<string, object> retValue = GetRetValueFromCollection(returnValueCollection);
if (retValue.Value != null)
{
if (builder.RetType.IsInstanceOfType(retValue.Value))
{
builder.RetValue = retValue.Value;
}
else
{
throw new InvalidOperationException("The returned type is mismatched");
}
}
else
{
builder.RetValue = null;
}
}
else
{
pipeline.Invoke();
}
//get out parameters values
builder.GetAllOutParameterValues(
sessionStateProxy,
targetMethod.GetParameters().Length);
}
else
{
pipeline.Invoke();
}
//check errors in the error pipeline
CheckErrorsInPipeline(pipeline);
}
catch (RuntimeException ex)
{
string errorMessage = ex.Message;
string traceInfo = ex.ErrorRecord.InvocationInfo.PositionMessage;
string ptfAdFailureMessage = string.Format(
"Exception thrown in PowerShell Adapter: {0} {1}", errorMessage, traceInfo);
throw new InvalidOperationException(ptfAdFailureMessage);
}
//close runspace and release resources
runspace.Close();
return builder;
}