如何使用C#Powershell System.Management.Automation

时间:2018-08-29 13:01:04

标签: c# datatable powershell-v4.0 psobject

我需要以与PowerShell相同的方式将PowerShell PSObject转换为流。 PowerShell还以通用方式在标准流上提供输出。

例如$PSVersionTable仅输出2列(Name,Value),而不输出整个Hashtable。 因此,我希望每个PSObject以与PowerShell后台执行的相同标准方式进行处理。此外,我想将其转换为DataTable。 我知道,还有其他链接可以说明此问题,但它们可在PSObject的所有属性上运行。 PowerShell会以某种方式立即执行此操作。

我需要将PSObject转换为其他类型吗?

示例

PowerShell脚本将$PSVersionTable输出为

PSVersion      5.1.17134.228
PSEdition      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}

$hostGet-Host输出为

Get-WebApplication输出

Name             Application pool   Protocols    Physical Path                                                                                                                                                                                                                 
----             ----------------   ---------    -------------                                                                                                                                                                                                                 
IisHostedServer  DefaultAppPool     http        C:\TestDirectory\Src\IisHostedServer  

Get-ChildItem -Path "C:\TestDirectory\TestSubDir\Studio"

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       29.06.2018     11:54                TestFileDir
d-----       24.07.2018     16:37                TestSites
-a----       13.08.2018     11:53            343 TestXml.xml

类似地,可能还有其他引用或自定义类型。

我想以相同的方式在C#中获得这些输出,并且需要将它们显示为String或DataTable。从PSObject到流是否有任何转换或以完全通用的方式返回到输出之上的转换?

在C#中处理以下方法时:

var outputCollection = new PSDataCollection<PSObject>();

outputCollection.DataAdded += OnOutputDataAdded;
powerShell.Invoke(null, outputCollection);

private void OnOutputDataAdded(object sender, DataAddedEventArgs e)
{
    var records = (PSDataCollection<PSObject>) sender;
    var data = records[e.Index];
    var outputTable = ConverToLogableDataStream(data);
}
private void ConverToLogableDataStream(PSObject)
{
    ...
    ...
}

1 个答案:

答案 0 :(得分:0)

这个问题已经很老了,但请看一下ConvertTo-Json并将其处理到您选择的数据表或类中(对我有用)

例如 电源外壳: 获取主机| ConvertTo-Json

C#: JsonConvert.DeserializeObject <列表<类名>>(PSObject)