【问题标题】:How to to Convert PSObject to Stream output or DataTable using C# Powershell System.Management.Automation如何使用 C# Powershell System.Management.Automation 将 PSObject 转换为流输出或 DataTable
【发布时间】:2019-02-04 06:46:24
【问题描述】:

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

例如$PSVersionTable 仅输出 2 列(名称、值)而不是整个哈希表。 因此,我希望每个 PSObject 都以与 PowerShell 在后台执行的方式相同的标准方式进行处理。此外,我想将其转换为 DataTable。 我知道,还有其他链接说明了这个问题,但它们正在对 PSObject 的所有属性进行操作。不知何故,PowerShell 开箱即用。

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

示例

PowerShell 脚本将$PSVersionTable 输出为

PS版本 5.1.17134.228 PSEdition 桌面版 PSCompatibleVersions {1.0、2.0、3.0、4.0...}

$hostGet-Host 输出为

Get-WebApplication 输出

名称 应用程序池 协议 物理路径 ---- ---- --------- ------------- IisHostedServer DefaultAppPool http C:\TestDirectory\Src\IisHostedServer

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

模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- d----- 29.06.2018 11:54 TestFileDir d----- 24.07.2018 16:37 测试站点 -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)
{
    ...
    ...
}

【问题讨论】:

  • PowerShell 输出格式有很多神奇之处。我在this answer 中介绍了其中的一些内容,但当然还有更多内容。例如,我在那里概述的内容并没有解释为什么 PowerShell 默认显示文件和目录对象的属性Mode,即使它不在.PSStandardMembers.DefaultDisplayPropertySet 中定义的属性中。
  • 那么,如何使用来自 PSObject 的 C# powershell api 获取 powershell 输出流。我手中只有 PSObject,我想将其转换为流,以便用户可以看到输出。转换为 DataTable 不是强制性的。但是如何从 PSObject 中提取或将 PSObject 转换为输出流
  • 如前所述,默认显示属性在$obj.PSStandardMembers.DefaultDisplayPropertySet 中列出,因此您可以从那里开始。但正如Get-ChildItem 输出所示,输出可能不仅仅包含这些。
  • PSStanardMembers.DefaultDisplayPropertySet 在 PSObject 中不可用?你是说 PSObject.Members 吗?
  • 错字。我的意思是$obj.PSStandardMembers.DefaultDisplayPropertySetPSStandardMembers 是像 PSObjectPSBase 这样的隐藏成员。使用$obj | Get-Member -Force 查看对象的所有(非静态)成员。

标签: c# datatable powershell-4.0 psobject


【解决方案1】:

这个问题已经很老了,但是看看 ConvertTo-Json 并从那里将它处理成您选择的数据表或类(对我有用)

例如。 电源外壳: 获取主机 |转换成Json

C#: JsonConvert.DeserializeObject>(PSObject)

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2016-02-03
    • 1970-01-01
    • 2022-01-06
    • 2011-08-12
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多