我正在尝试调用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<PSObject> 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 "
}
我遇到以下异常:
术语“BatAvg”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。
我承认,我做错了什么,我对PowerShell知之甚少。
答案 0 :(得分:7)
这似乎对我有用:
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<string, string>
{
{"Name" , "John"},
{"Runs", "6996"},
{"Outs","70"}
});
foreach (PSObject result in ps.Invoke())
{
Console.WriteLine(result);
}
}
答案 1 :(得分:1)
由于似乎Runspace
需要与Powershell
相关联才能使其发挥作用 - 请参阅MSDN上的示例代码。
答案 2 :(得分:1)
可以进一步简化解决方案,因为在这种情况下不需要非默认的运行空间。
var ps = PowerShell.Create();
ps.AddScript(script);
ps.Invoke();
ps.AddCommand("BatAvg").AddParameters(new Dictionary<string, string>
{
{"Name" , "John"}, {"Runs", "6996"}, {"Outs","70"}
});
foreach (var result in ps.Invoke())
{
Console.WriteLine(result);
}
另一个缺陷是使用AddScript(script, true)
以使用本地范围。将遇到相同的异常(即&#34;术语&#39; BatAvg&#39;未被识别为cmdlet,函数,脚本文件或可操作程序的名称。&#34;)。