C# 将Powershell PSObject作为C中的数据表返回

C# 将Powershell PSObject作为C中的数据表返回,c#,powershell,datatable,psobject,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\\Power

我编写了一个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();
但是,我很难将此解决方案转换为动态解决方案。也就是说,行数预计会有所不同。因此,我以前在源代码是SQL数据库时使用了与发布的解决方案类似的解决方案实现了这一点,因此我假设datatables应该是解决方案,但我无法让它在这种情况下工作。有什么想法或建议吗?谢谢


注意:这里的Powershell脚本组件是必需的,因为它包括其他机制来制定输出,所以虽然我可以使用C从CSV文件中读取,这根本不是一个选项。

我从您的问题中了解到的是,您希望使用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);
   }
}
希望对你有帮助


文档已存在:

既然您已经在使用powershell读取csv文件,为什么不继续

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

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

也许您甚至可以将这两种方法结合起来,类似于:

var shell = PowerShell.Create();
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1 | foreach {do-something $_}");
Collection<PSObject> results = shell.Invoke();
请注意,我在返回脚本结果后添加了一个管道。请记住,“AddScript”非常类似于向powershell.exe发送一堆文本。我以前曾将整个脚本文件从嵌入式资源推送到过此方法。

使用Linq:

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

然后设置myDataGrid.ItemsSource=dynamicResults

你有什么问题?据我所知,您正在迭代所有结果并访问其属性,而没有任何问题,那么由可变行数引起的确切问题是什么呢?嗨,Lucas,我只能在知道有多少行的情况下获取值。数组引用类似于数组[0]或“数组[1]。我正在尝试创建一个函数,它可以将所有结果存储到数据表中。希望这能澄清问题。当您使用foreach语句进行迭代时,不需要数组引用。即使您这样做了,您也可以为iIEnumerable<dynamic> dynamicResults = from item in results select new { Name = item.Name, Count = item.Count };