Вызов функций Powershell из C # - PullRequest
       4

Вызов функций Powershell из C #

12 голосов
/ 14 ноября 2010

У меня есть файл PS1 с несколькими функциями Powershell.Мне нужно создать статическую DLL, которая читает все функции и их определения в памяти.Затем он вызывает одну из этих функций, когда пользователь вызывает библиотеку DLL и передает имя функции, а также параметры для функции.

Мой вопрос: возможно ли это сделать?т.е. вызывать функцию, которая была прочитана и сохранена в памяти?

Спасибо

Ответы [ 2 ]

12 голосов
/ 22 апреля 2014

Вот эквивалентный код C # для кода, упомянутого выше

string script = "function Test-Me($param1, $param2) { \"Hello from Test-Me with $param1, $param2\" }";

using (var powershell = PowerShell.Create())
{
    powershell.AddScript(script, false);

    powershell.Invoke();

    powershell.Commands.Clear();

    powershell.AddCommand("Test-Me").AddParameter("param1", 42).AddParameter("param2", "foo");

    var results = powershell.Invoke();
}
5 голосов
/ 15 ноября 2010

Это возможно и несколькими способами. Вот, пожалуй, самый простой.

Учитывая, что наши функции находятся в скрипте MyFunctions.ps1 (только для этой демонстрации):

# MyFunctions.ps1 contains one or more functions

function Test-Me($param1, $param2)
{
    "Hello from Test-Me with $param1, $param2"
}

Тогда используйте код ниже. Он находится в PowerShell, но буквально переводится в C # (вам следует это сделать):

# create the engine
$ps = [System.Management.Automation.PowerShell]::Create()

# "dot-source my functions"
$null = $ps.AddScript(". .\MyFunctions.ps1", $false)
$ps.Invoke()

# clear the commands
$ps.Commands.Clear()

# call one of that functions
$null = $ps.AddCommand('Test-Me').AddParameter('param1', 42).AddParameter('param2', 'foo')
$results = $ps.Invoke()

# just in case, check for errors
$ps.Streams.Error

# process $results (just output in this demo)
$results

Выход:

Hello from Test-Me with 42, foo

Подробнее о классе PowerShell см.

http://msdn.microsoft.com/en-us/library/system.management.automation.powershell

...