2011-09-03 88 views
5

我试图调用一个函数在一个PowerShell文件如下PowerShell的功能:问题与调用从C#

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知之甚少。

回答

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

看起来Runspace需要连接到Powershell才能生效 - 请参阅MSDN上的示例代码。

+0

不,仍然会得到相同的异常:runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace =运行空间; ps.AddScript(script); 命令c = new Command(“BatAvg”,false); ps.AddCommand(“BatAvg”,false); ps.AddParameter(“Name”,“John”); ps.AddParameter(“Runs”,“6996”); ps.AddParameter(“Outs”,“70”); ()中的PSObject obj) // do somethingConsole.WriteLine } – user577240

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)。遇到同样的例外(即“术语”BatAvg“不被识别为cmdlet,函数,脚本文件或可操作程序的名称)。