Передать пользовательский объект из C # в Powershell - PullRequest
5 голосов
/ 30 ноября 2011

У меня есть класс C #, который должен выполнить скрипт Powershell, передав ему объект Log. Журнал полностью написан на C # и должен быть общим для кода C # и Powershell для достижения общего ведения журнала.

Может кто-нибудь сказать, как я могу передать пользовательский объект из C # в Powershell и использовать его там?

Ответы [ 4 ]

2 голосов
/ 24 июля 2013

Я верю, что использование runspace решит вашу проблему. Хорошее объяснение и примеры по ним вы можете найти по следующей ссылке: http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C.

Просто общее представление о том, как их использовать.

если у вас есть скрипт:

param($logger2)
$logger2.Write("logger2 Write was called");
$logger.Write("logger Write was called");

и вы хотите заменить logger2, и регистратор использует следующий код:

String scriptContent = // get script content
Logger logger = new Logger();
Logger2 logger2 = new Logger2();
// create ps runspace
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
    // start session
    runspace.Open();
    // set variables
    runspace.SessionStateProxy.SetVariable("logger", logger);
    // supply commands
    using (Pipeline pipeline = runspace.CreatePipeline())
    {
        // create ps representation of the script
        Command script = new Command(scriptContent, true, false);
        // suppy parameters to the script
        script.Parameters.Add(new CommandParameter("logger2", logger2));
        // send script to pipeline
        pipeline.Commands.Add(script);
        // execute it
        Collection<PSObject> results = pipeline.Invoke();
        // close runspace
        runspace.Close();
    }
}
1 голос
/ 30 ноября 2011

Если вам просто нужно использовать класс в скрипте powershell, вы можете поместить действительный код C# в сам скрипт и использовать его в качестве определения для типа.

Здесь есть учебник.

В основном вы используете Add-Type -TypeDefinition <C# code> -Language CSharp

1 голос
/ 30 ноября 2011

Вы можете разделить класс между PowerShell и C #, скомпилировав свой класс Log в сборку и используя LoadFile в PowerShell (должен работать в V1 и V2)

$lib = [System.Reflection.Assembly]::LoadFile('path to your dll');
$lib.Log("Terrible things have happened!")

Однако если вы хотите поделиться экземпляром класса между PowerShell и C #, вы можете использовать SessionStateProxy.SetVariable.

0 голосов
/ 30 ноября 2011

Добавьте ссылку на system.management.automation.dll в свой проект и используйте PowerShell Class . Смотрите пример там, он почти готов, измените строку

ps.AddCommand("Get-Process");

что-то вроде:

ps.AddCommand(<script-path/name-of-script-in-path>).AddParameter("Log", logInstance);

Он сообщает, чтобы вызвать ваш скрипт с параметром Log, значение которого является экземпляром logInstance, который должен быть передан в скрипт. Скрипт должен иметь параметр Log и использовать его как $Log в своем коде:

param($Log)

$Log.Write("Begin ...")
...
$Log.Write("End ...")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...