从c#调用powershell函数的问题

我正在尝试调用powershell文件中的函数,如下所示:

string script = System.IO.File.ReadAllText(@"C:\Users\Bob\Desktop\CallPS.ps1"); using (Runspace runspace = RunspaceFactory.CreateRunspace()) { runspace.Open(); using (Pipeline pipeline = runspace.CreatePipeline(script)) { Command c = new Command("BatAvg",false); c.Parameters.Add("Name", "John"); c.Parameters.Add("Runs", "6996"); c.Parameters.Add("Outs", "70"); pipeline.Commands.Add(c); Collection results = pipeline.Invoke(); foreach (PSObject obj in results) { // do somethingConsole.WriteLine(obj.ToString()); } } } 

powershell函数在CallPS.ps1中:

 Function BatAvg { param ($Name, $Runs, $Outs) $Avg = [int]($Runs / $Outs*100)/100 Write-Output "$Name's Average = $Avg, $Runs, $Outs " } 

我收到以下exception:

术语“BatAvg”不被识别为cmdlet,函数,脚本文件或可操作程序的名称。

我承认,我做错了什么,我对PowerShell知之甚少。

这似乎对我有用:

 using (Runspace runspace = RunspaceFactory.CreateRunspace()) { runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddScript(script); ps.Invoke(); ps.AddCommand("BatAvg").AddParameters(new Dictionary { {"Name" , "John"}, {"Runs", "6996"}, {"Outs","70"} }); foreach (PSObject result in ps.Invoke()) { Console.WriteLine(result); } } 

由于看起来Runspace需要连接到Powershell才能实现这一function – 请参阅MSDN上的示例代码。

可以进一步简化解决方案,因为在这种情况下不需要非默认的运行空间。

 var ps = PowerShell.Create(); ps.AddScript(script); ps.Invoke(); ps.AddCommand("BatAvg").AddParameters(new Dictionary { {"Name" , "John"}, {"Runs", "6996"}, {"Outs","70"} }); foreach (var result in ps.Invoke()) { Console.WriteLine(result); } 

另一个缺陷是使用AddScript(script, true)以使用本地范围。 将遇到相同的exception(即“术语’BatAvg’未被识别为cmdlet,函数,脚本文件或可操作程序的名称。”)。