Ask Powershell to process a list of objects from a C # program

I want to add an object to a C # application where I can:

1) Take a collection of objects and pass it to a powershell script from my C # application

2) Change the powershell script to make changes to the list of transferred objects

3) Bring this list of objects back to C #

I have an external class called Message

public class Message { public String name { get; set; } public String from { get; set; } public String to { get; set; } public String date { get; set; } public String subject { get; set; } public String body { get; set; } } 

I populate the list class PSDataCollection as such:

  PSDataCollection<Message> mlist = new PSDataCollection<Message>() { new Message { to="user1", from="user2", date = "1/10/2010 12:00:00 AM EST", subject = "hi there" , body = "hi again" }, new Message { to="user1", from="user3", date = "1/10/2010 12:00:00 AM EST", subject = "new messages" , body = "new messages" } } 

In the powershell script we want it 1) Read each object 2) Adjust the date field by adding 2 hours to it

Implementation Issues:

The following code is our attempt to make it work. The first problem we encountered was how to import the Message class from an external DLL.

We tried this: Add-Type "G: \ testBAL \ bin \ Debug \ testBAL.dll", but got errors

Any help would be appreciated.

 namespace TestProject { class Program { static void Main(string[] args) { PSDataCollection<Message> mlist = new PSDataCollection<Message>() { new Message { to="user1", from="user2", date = "1/10/2010 12:00:00 AM EST", subject = "hi there" , body = "hi again" }, new Message { to="user1", from="user3", date = "1/10/2010 12:00:00 AM EST", subject = "new messages" , body = "new messages" } }; mlist.Complete(); PowerShell ps = PowerShell.Create() .AddScript("Add-Type G:\testBAL\bin\Debug\testBAL.dll") .AddCommand("Select-Object"); IAsyncResult async = ps.BeginInvoke<Message>(mlist); foreach(PSObject result in ps.EndInvoke(async)) { String to = ((Message)(result.BaseObject)).to; Console.WriteLine("to=" + to); } } } } 
+4
source share
3 answers

You can use Runspace PowerShell to set and retrieve variables in a PowerShell session created in a .NET application. I edited the date parameter and deleted EST, so it could be easily parsed using the PowerShell Get-Date cmdlet.

NTN

Arc

 var mlist = new PSDataCollection<Message>() { new Message { to="user1", from="user2", date = "1/10/2010 12:00:00 AM", subject = "hi there" , body = "hi again" }, new Message { to="user1", from="user3", date = "1/10/2010 12:00:00 AM", subject = "new messages" , body = "new messages" } }; var rs = RunspaceFactory.CreateRunspace(); rs.Open(); rs.SessionStateProxy.SetVariable("list", mlist); var ps = PowerShell.Create(); ps.Runspace = rs; ps.AddScript(@" $list | ForEach { $_.date = (Get-Date($_.date)).AddHours(2) } "); ps.Invoke(); var result = rs.SessionStateProxy.GetVariable("list") as PSDataCollection<Message>; foreach (var item in result) { Console.WriteLine(item.date); } rs.Close(); 
+6
source

From your description, it seems to you that you did not specify the -Path switch.

You must specify -Path when you pass the DLL directly. See the Help documentation here ... http://technet.microsoft.com/en-us/library/dd315241.aspx

0
source

I loaded the C # assembly in a PowerShell script and used it like this:

 $dllPath = "C:\path\library.dll" $tmp = [Reflection.Assembly]::LoadFile($dllPath) $obj = new-object Namespace.LibraryClass() 
0
source

Source: https://habr.com/ru/post/1345788/


All Articles