Проблема с вызовом функции powershell из c # - PullRequest
5 голосов
/ 03 сентября 2011

Я пытаюсь вызвать функцию в файле 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» не распознается как имя командлета, функции, файла сценария или работоспособной программы.

Что я делаю не так, признаюсь, я очень мало знаю о PowerShell.

Ответы [ 3 ]

7 голосов
/ 04 сентября 2011

Мне кажется, это работает:

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 голос
/ 13 декабря 2017

Решение можно еще больше упростить, так как в этом случае не требуется пространство запуска по умолчанию.

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 голос
/ 03 сентября 2011

Как кажется, Runspace необходимо подключить к Powershell, чтобы это работало - см. Пример кода на MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...