【问题标题】:Return Powershell PSObject as DataTable in C#在 C# 中将 Powershell PSObject 作为 DataTable 返回
【发布时间】:2017-05-08 18:45:02
【问题描述】:

我编写了一个 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 文件中读取,但这根本不是一个选项。

【问题讨论】:

  • 你有什么问题?据我了解,您正在迭代所有结果并毫无问题地访问其属性,那么由可变行数引起的确切问题是什么?
  • 嗨 Lucas,如果我知道有多少行,我只能获取值。 (数组引用类似于array[0] 或'array[1])。我正在尝试创建一个可以将所有结果存储到数据表的函数。希望能解决这个问题。
  • 当您使用 foreach 语句进行迭代时,您不需要数组引用。即使你这样做了,你也可以使用 for 语句 for i
  • 你能把powershell脚本的部分贴出来吗?您的 C# 代码看起来正确,可能问题出在 powershell 中。

标签: c# powershell datatable psobject


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    在 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 发送一堆文本。我之前已经将整个脚本文件从嵌入式资源推送到此方法。

    【讨论】:

      【解决方案3】:

      使用 Linq:

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

      然后设置myDataGrid.ItemsSource = dynamicResults;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-04
        • 2022-01-06
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多