[英]How to Pass PSCredential object from C# code to Powershell Function
[英]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.