btw - this is the code I used to measure performance:
using System;
using System.Collections.Generic;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
namespace PowerShellDemo
{
class Program
{
static void Main(string[] args)
{
RunspaceConfiguration runspaceConfiguration = null;
MshSnapInException mshSnapinException = null;
Runspace runspace = null;
string EXCHANGE_MANAGEMENT_ADMIN =
"Microsoft.Exchange.Management.Msh.Admin";
Console.WriteLine("press any key to make PowerShell call...");
Console.ReadKey();
Output("step", "msec");
Output("----", "----");
DateTime dtStart;
DateTime dtStartStep;
dtStart = DateTime.Now;
dtStartStep = DateTime.Now;
runspaceConfiguration = RunspaceConfiguration.Create();
Output("RunspaceConfigurationCreated", dtStartStep);
dtStartStep = DateTime.Now;
runspaceConfiguration.AddMshSnapIn(EXCHANGE_MANAGEMENT_ADMIN,
out mshSnapinException);
Output("MshSnapIn Added", dtStartStep);
dtStartStep = DateTime.Now;
runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
Output("RunspaceCreated", dtStartStep);
dtStartStep = DateTime.Now;
runspace.Open();
Output("RunspaceOpened", dtStartStep);
Command cmd = new Command("get-Date");
ICollection<MshObject> results = null;
Pipeline pipeLine = null;
try
{
dtStartStep = DateTime.Now;
pipeLine = runspace.CreatePipeline();
Output("PipelineCreated", dtStartStep);
dtStartStep = DateTime.Now;
using (pipeLine)
{
pipeLine.Commands.Add(cmd);
results = pipeLine.Invoke();
}
Output("PipelineInvoked", dtStartStep);
}
finally
{
pipeLine = null;
if (null != runspace)
runspace.Close();
runspace.Dispose();
runspace = null;
}
dtStartStep = DateTime.Now;
string result = "";
foreach (MshObject obj in results)
{
result = obj.ToString();
}
Output("ResultsRetrieved", dtStartStep);
Output("Total", dtStart);
Console.WriteLine(string.Format("\nget-Date result:\t{0}",
result));
Console.WriteLine("press any key to end...");
Console.ReadKey();
}
private static void Output(string stepName, DateTime dtStartStep)
{
TimeSpan tsStep = DateTime.Now - dtStartStep;
int seconds = (int)tsStep.TotalMilliseconds;
Output(stepName + ":", seconds.ToString());
}
private static void Output(string stepName, string data)
{
if (stepName.Length < 8)
Console.WriteLine(string.Format("{0}\t\t\t\t{1,11}",
stepName, data));
else if (stepName.Length < 16)
Console.WriteLine(string.Format("{0}\t\t\t{1,11}", stepName,
data));
else if (stepName.Length < 24)
Console.WriteLine(string.Format("{0}\t\t{1,11}", stepName,
data));
else
Console.WriteLine(string.Format("{0}\t{1,11}", stepName,
data));
}
}
}