c# - 如何使用 C# Powershell System.Management.Automation 将 PSObject 转换为流输出或 DataTable
问题描述
我需要以与 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...}
$host
或Get-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)
{
...
...
}
解决方案
这个问题已经很老了,但是看看 ConvertTo-Json 并从那里将它放入您选择的数据表或类中(为我工作)
例如。Powershell:获取主机 | 转换为 JSON
C#:JsonConvert.DeserializeObject<列表<类名>>(PSObject)
推荐阅读
- asp.net - 令牌应该在路由中吗?
- c++ - 进入 C++ 第 17 章问题 4 - 二叉树
- javascript - 使用 dangerouslySetInnerHTML 在 React 中插入完整的 HTML
- c++ - 为什么我的结构在包含字符串时会崩溃?
- jenkins - 由于读取超时,Jenkins 插件管理器无法安装/更新插件
- reactjs - 粘贴文件在剪贴板中不起作用(更新->关于剪贴板权限)
- c# - EF Core (3.1) 工具:有没有办法将数据库降级到之前的迁移?
- python - 已安装 lxml 但仍有“ImportError: lxml not found, please install it”错误
- android - Unity - 2019.3 Mobile Android APK 加载失败
- java - 关系实体的 Spring Data Neo4j 存储库