从C#调用PowerShell函数出现问题

5
我正在尝试调用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 "
}

我遇到了以下异常:
在PowerShell中,'BatAvg'不被识别为命令、函数、脚本文件或可执行程序的名称。
我做错了什么?我承认,我对PowerShell知之甚少。
3个回答

8
这对我似乎有效:
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
解决方案可以进一步简化,因为在这种情况下不需要使用非默认的Runspace。
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)来使用局部作用域。会遇到相同的异常(即“BatAvg”一词未被识别为命令、函数、脚本文件或可操作程序)。

1

看起来需要将 Runspace 连接到一个 Powershell 才能使其工作 - 请参阅 MSDN 上的示例代码。


不行,仍然出现相同的异常:runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddScript(script);Command c = new Command("BatAvg",false); ps.AddCommand("BatAvg",false);ps.AddParameter("Name", "John"); ps.AddParameter("Runs", "6996"); ps.AddParameter("Outs", "70"); foreach (PSObject obj in ps.Invoke()) { // do somethingConsole.WriteLine(obj.ToString()); } - user577240

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接