繁体   English   中英

将自定义对象从C#传递给Powershell

[英]Pass a custom object from C# to Powershell

我有一个C#类,它应该通过传递一个Log对象来执行Powershell脚本。 Log完全用C#编写,并且应该在C#代码和Powershell之间共享以实现常见的日志记录。

有人可以告诉我如何将自定义对象从C#传递给Powershell并在那里使用它吗?

我相信它使用运行空间将解决您的问题。 您可以在以下链接中找到有关它们的详细解释和示例: 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和logger使用以下代码:

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

您可以通过将Log类编译为程序集并在PowerShell中使用LoadFile来共享PowerShell和C#之间的类(应该在V1和V2中工作)

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

但是,如果要在PowerShell和C#之间共享类的实例,则可以使用SessionStateProxy.SetVariable

如果您只需要在powershell脚本中使用该类,则可以将实际的C#代码放入脚本本身并将其用作类型的定义。

这里有一个教程。

基本上你使用Add-Type -TypeDefinition <C# code> -Language CSharp

system.management.automation.dll的引用添加到项目中并使用PowerShell类 看那里的例子,它几乎准备好了,改变线

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 ...")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM