2011-09-03 87 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,函數,腳本文件或可操作程序的名稱)。