Return Powershell PSObject 作为 C# 中的 DataTable
Return Powershell PSObject as DataTable in C#
我编写了一个 Powershell 脚本来读取 CSV 文件和 returns 从数据中预先确定的集合。以下是所述脚本的示例输出。
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 文件中读取,但这根本不是一个选项。
我从你的问题中了解到,你希望有 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# 管理文件之前,您可以调用 powershell command/script 来迭代 *.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 发送一堆文本。我之前已经将整个脚本文件从嵌入式资源推送到此方法。
使用 Linq:
IEnumerable<dynamic> dynamicResults = from item in results
select new { Name = item.Name, Count = item.Count };
然后设置myDataGrid.ItemsSource = dynamicResults;
我编写了一个 Powershell 脚本来读取 CSV 文件和 returns 从数据中预先确定的集合。以下是所述脚本的示例输出。
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 文件中读取,但这根本不是一个选项。
我从你的问题中了解到,你希望有 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# 管理文件之前,您可以调用 powershell command/script 来迭代 *.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 发送一堆文本。我之前已经将整个脚本文件从嵌入式资源推送到此方法。
使用 Linq:
IEnumerable<dynamic> dynamicResults = from item in results
select new { Name = item.Name, Count = item.Count };
然后设置myDataGrid.ItemsSource = dynamicResults;