在C#中将Powershell PSObject作为DataTable返回

时间:2016-12-23 04:05:21

标签: c# powershell datatable psobject

我编写了一个Powershell脚本,该脚本读取CSV文件并从数据中返回预定的集合。以下是所述脚本的示例输出。

Count     Name
------   ------
  12      Rubies
   3      Pearls
  20      Emeralds

我可以通过将它存储在PSObject中来获得C#中的结果:

var shell = PowerShell.Create();
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1");
Collection<PSObject> results = shell.Invoke();

现在,当我期待单个对象时,我能够获取每个值并将它们分配给这样的变量:

foreach (PSObject psObject in results)
{
   localVariable = Convert.ToString(psObject.Properties["Name"].Value);
}

但是,我无法将此解决方案转换为动态解决方案。也就是说,预计行数会有所不同。所以我之前已经实现了这个,当源是一个SQL数据库时,使用类似于发布的here的解决方案,所以我假设数据表应该是要走的路,但是我不知道在这种情况下工作。任何想法或建议?谢谢!

注意:此处的Powershell脚本组件是强制性的,因为它包含其他配置输出的机制,所以当我只能使用C#读取CSV文件时,这根本不是一个选项。

3 个答案:

答案 0 :(得分:1)

我从您的问题中了解到,您希望将DataTable用于进一步的数据处理,并且您希望在各自的集合中使用它。

您可以这样继续:

DataTable dt=new DataTable();
dt.Colums.Add("Count");
dt.Colums.Add("Name");
foreach (PSObject psObject in results)
{
   foreach(PSPropertyInfo prop in psObject.Properties)
   {
     var count=prop.Name; 
     var name=prop.Value;
     //In other words generate output as you desire.
     dt.Rows.Add(count,name);
   }
}

希望它对你有所帮助。

有文档:Doc 1Doc 2

答案 1 :(得分:1)

因为您已经使用PowerShell来读取csv文件,为什么不继续?

在开始用C#管理之前,您可以调用powershell命令/脚本来迭代* .ps1文件的结果。

在c#中调用脚本非常容易,您不必将脚本创建为文件。您可以直接发送脚本文本并调用它。

也许你甚至可以将2类似于:

var shell = PowerShell.Create();
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1 | foreach {do-something $_}");
Collection<PSObject> results = shell.Invoke();

请注意,我在返回脚本结果后添加了一个管道。请记住,'AddScript'非常类似于向powershell.exe发送一堆文本。我之前已将整个脚本文件从嵌入式资源推送到此方法。

答案 2 :(得分:1)

使用Linq:

IEnumerable<dynamic> dynamicResults = from item in results                                     
                                      select new { Name = item.Name, Count = item.Count };

然后设置myDataGrid.ItemsSource = dynamicResults;