2011-09-03 30 views
5

Tôi đang cố gắng để gọi một hàm trong một file powershell như sau:Vấn đề với cách gọi một chức năng PowerShell từ 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()); 
      } 
     } 
    } 

Chức năng PowerShell là trong CallPS.ps1:

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

tôi nhận ngoại lệ sau:

Thuật ngữ 'BatAvg' không được công nhận là tên của lệnh ghép ngắn, hàm, tệp tập lệnh hoặc chương trình có thể hoạt động.

Tôi đang làm gì sai, tôi thừa nhận, tôi biết rất ít về PowerShell.

Trả lời

7

Điều này dường như làm việc cho tôi:

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

Có vẻ như Runspace cần được kết nối với Powershell để thực hiện công việc đó - xem mã mẫu tại MSDN.

+0

Không, vẫn nhận được ngoại lệ tương tự: runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddScript (tập lệnh); Lệnh c = Lệnh mới ("BatAvg", sai); ps.AddCommand ("BatAvg", false); ps.AddParameter ("Tên", "John"); ps.AddParameter ("Chạy", "6996"); ps.AddParameter ("Outs", "70"); foreach (PSObject obj in ps.Invoke()) { // do somethingConsole.WriteLine (obj.ToString()); } – user577240

1

Các giải pháp có thể được đơn giản hóa hơn nữa như trong trường hợp này một Runspace không mặc định là không cần thiết.

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); 
} 

Một lỗ hổng khác là sử dụng AddScript(script, true) để sử dụng phạm vi địa phương. Ngoại lệ tương tự sẽ gặp phải (tức là "Thuật ngữ 'BatAvg' không được nhận dạng là tên của lệnh ghép ngắn, hàm, tệp kịch bản hoặc chương trình có thể hoạt động.").

Các vấn đề liên quan