将哈希表值属性导出到 CSV 文件

2023-12-14

我正在运行Test-AdfsServerHealth (Ref.)

问题是,输出值之一(值名称Output) 是一个数组,显示为System.Collection.Hashtable我正在尝试找到一种方法以简洁的 Excel 格式获取此内容。

例如,这是我导出时 CSV 上的实际值之一:



Name    Result  Detail  Output
TestServiceAccountProperties    Pass    "" System.Collections.Hashtable
  

但 PowerShell 显示:



Name             : TestServiceAccountProperties
Result           : Pass
Detail           :
Output           : {AdfsServiceAccount, AdfsServiceAccountDisabled, AdfsServiceAccountLockedOut,
                   AdfsServiceAccountPwdExpired...}
ExceptionMessage :
  

我正在运行的实际命令是:

$ServerResult = Test-AdfsServerHealth

tl;dr:

Test-AdfsServerHealth | 
  Select-Object Name, Result, Detail, @{ 
    n='Output'
    e={ $_.prop2.GetEnumerator().ForEach({ '{0}={1}' -f $_.Key, $_.Value }) -join ' ' } 
  } | ExportTo-Csv out.csv

上面对每一个进行了序列化.Output哈希表的条目由空格分隔组成的单行字符串<key>=<value>对(PSv4+ 语法)应该在 CSV 输出中工作得相当好。


Since CSV 是一个text format, PowerShell 通过调用对象来序列化要导出的对象.ToString() method.

复杂的对象,例如[hashtable]实例通常只产生它们的完整类型名称(System.Collections.Hashtable) for .ToString(),这在 CSV 中没有用。

一个简化的例子(我正在使用ConvertTo-Csv,但该示例同样适用于Export-Csv):

# Create a custom object whose .col2 property is a hashtable with 2 
# sample entries and convert it to CSV
PS> [pscustomobject] @{ prop1 = 1; Output = @{ name='foo'; ID=666 } } | ConvertTo-Csv

"prop1","Output"
"1","System.Collections.Hashtable"

如果所有输出对象来自Test-AdfsServerHealth它们具有相同的哈希表结构.Output财产,你可以尝试flatten哈希表通过使其条目拥有自己的列来创建,但听起来情况并非如此。

因此你必须手动将哈希表转换为适合单个 CSV 列的文本表示形式:

你可以这样做Select-Object and a 计算属性它为您执行转换,但您需要决定在 CSV 文件上下文中有意义的文本表示形式。

在以下示例中,由空格分隔的单行字符串<key>=<value>创建对(PSv4+ 语法)。

[pscustomobject] @{ prop1 = 1; Output = @{ name='foo'; ID=666 } } | 
  Select-Object prop1, @{ 
    n='Output'
    e={ $_.prop2.GetEnumerator().ForEach({ '{0}={1}' -f $_.Key, $_.Value }) -join ' ' } 
  } | ConvertTo-Csv

For an explanation of the hashtable format that creates the calculated prop2 property, see this answer of mine.

上面的结果是:

"prop1","prop2"
"1","ID=666 name=foo"

但请注意,如果哈希表中的值又是仅序列化为其类型名称的复杂对象,则必须应用该方法递归地.


可选阅读:将哈希表属性展平为单独的列

如果要导出到 CSV 文件的对象的哈希表值属性全部具有结构相同,您可以选择使哈希表条目每个都有自己的输出列。

让我们采用以下示例输入:2 个自定义对象的集合,其.prop2value 是一个具有一组统一的键(条目)的哈希表:

$coll = [pscustomobject] @{ prop1 = 1; prop2 = @{ name='foo1'; ID=666 } },
        [pscustomobject] @{ prop1 = 2; prop2 = @{ name='foo2'; ID=667 } }

如果您预先知道(感兴趣的)关键名称,您可以简单地使用计算属性的显式列表来创建各个列:

$coll | select prop1, @{ n='name'; e={ $_.prop2.name } }, @{ n='ID'; e={ $_.prop2.ID } } |
  ConvertTo-Csv

上面的结果如下,显示哈希表条目变成了自己的列,name and ID:

"prop1","name","ID"
"1","foo1","666"
"2","foo2","667"

需要更先进的技术如果你这样做not预先知道按键名称:

# Create the list of calculated properties dynamically, from the 1st input
# object's .prop2 hashtable.
$propList = foreach ($key in $coll[0].prop2.Keys) {
  # The script block for the calculated property must be created from a 
  # *string* in this case, so we can "bake" the key name into it.
  @{ n=$key; e=[scriptblock]::Create("`$_.prop2.$key") } 
}

$coll | Select-Object (, 'prop1' + $propList) | ConvertTo-Csv

这会产生与上一个命令相同的输出,并具有固定的计算属性列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将哈希表值属性导出到 CSV 文件 的相关文章

随机推荐

  • 如何将比例平移应用到 DrawingContext?

    我有一个Canvas在 XAML 中应用比例转换 使用DrawingContext我在上面画线Canvas 我现在需要向屏幕添加文本 我认为使用格式化文本我可以应用翻译 但是格式化文本或DrawingContext接受RenderTrans
  • 通过cmd运行带引号的powershell命令

    我需要通过 CMD 运行 powershell 命令 我的命令是 Get WmiObject Class win32 pnpEntity Filter Name like ACPI Thermal Zone 1 GetDevicePrope
  • 使用 javascript/jquery 对 JSON 数据进行分组/排序

    我有一个 JSON 数据 我需要做一些类似 group by 的事情 我之前在这里问过这个问题 但我没有得到任何满意的答案 所以这次我想更深入地解释一下 首先 谁能解释一下两者之间的区别groupby and orderby在 javasc
  • 如何按帖子元素对帖子数组进行排序?

    我有一个应用程序 用户可以在其中搜索待售商品 我目前正在尝试添加功能 以便用户可以查看按价格从低到高排序的商品 用户点击排序按钮后 他们会看到另一个显示不同排序选项的视图控制器 第一个是 价格 从低到高 从低到高被点击后 我使用协议发回一个
  • Android Api 8. 从视图中获取 x 和 y,并在按钮上设置 x 和 y

    我正在使用 API 8 进行编码 我需要从视图中获取坐标 X 和 Y 并将它们设置为新按钮的坐标 我尝试了不同的方法但没有任何作用 setX 和 getX 方法仅适用于 api 级别 11 我需要一种方法在 API8 上执行此操作 这是我的
  • 将文本文件读入数组列表

    我对 Java 很陌生 所以我在解决这个问题时遇到了一些麻烦 所以基本上我有一个如下所示的文本文件 1 John false 2 Bob false 3 Audrey false 如何从文本文件的每一行创建一个 ArrayList 从文件中
  • 为一个小团队和多个并行项目设置 TFS

    我们有一个五人开发团队 将并行构建多个内部项目 经过研究 我发现最好创建一个团队项目 即使对于我们的情况也是如此 对吗 如果是这样 您能否建议如何为项目和时间表设置适当的迭代 TFS 问题 小团队 多个项目听起来与我的情况相似 但我似乎无法
  • 如何获取接口成员列表

    有没有办法获取接口成员列表 我了解 System Reflection MemberInfo 但它包括对象中的所有内容 而不仅仅是某个接口 这是程序 我不知道如何获得接口 因为它不是我写的 但它是 Ascom 标准的一部分 http asc
  • Android ExpandableListView - 寻找教程[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在尝试编写一个 And
  • Sveltekit Actions 返回乱码 json

    从 Sveltekit 操作返回的 json 是乱码 我期望这样的事情 foo bar foo2 bar2 但我得到的是这个 Array foo 1 foo2 2 bar bar2 对于嵌套数据来说 这更令人烦恼 这就是我发送的方式 con
  • 传入未定义的目的是什么?

    我注意到了jQuery以及相关的主题插件 例如jQuery UI pass undefined作为模块定义中使用的匿名函数的参数 如下所示 function undefined jQuery 另外 我注意到 jQuery 推荐的其他插件和
  • 如何以编程方式将类或伪类添加到 JavaFX 中的自定义控件?

    在JavaScript世界中 通常设置元素类来表示它的外观 后来由CSS定义 JavaFX 中也是这样吗 例如 如果我想将负值涂成红色怎么办 TableView细胞 我不会直接编码颜色 但为单元格分配了一些类 例如 负 然后将其着色为红色C
  • 创建我的第一个树枝扩展以向基本模板提供全局变量

    我需要用一些 HTML 代码填充一个变量 并使其可用于我的 base html twig 文件 为了实现这一点 我做了一个树枝扩展 这是我第一次使用树枝扩展 所以我不确定这是否是正确的做法 这是我到目前为止所拥有的 扩展代码 class G
  • 如何更改spark中的日志级别?

    我尝试了所有这些方法 但没有任何作用 在 log4j 文件中 log4j logger org OFF log4j rootCategory ERROR console log4j rootCategory OFF console 在代码中
  • wxpython面板全屏?

    我试图让我的程序的 top panel 仅进入全屏 我希望有一个按钮可以执行此操作 我面临的问题是我不知道如何使面板自行进入全屏而不强制整个使用 ShowFullscreen true 进入全屏的框架 我希望你可以帮助我 class top
  • 如何使用 pytest Monkeypatch 模拟两个连续的控制台输入

    如果第一个用户输入的答案是 n 则模块 overwrite file 请参阅 代码示例 会要求输入新文件名 在我的测试设置中 我使用两个连续的 Monkeypatch setattr 调用来模拟输入 如果我使用以下顺序 结果将是无限循环 m
  • delphi获取成员函数指针

    有没有一些技巧如何在 Lazarus delphi 中获取成员函数的指针 我有这段代码无法编译 错误是 在德尔福 variable required在拉撒路 Error Incompatible types got
  • 没有数据库的休眠搜索

    是否可以仅将 hibernate search 用于其注释 bean gt document document gt bean 映射 而不使用数据库 如果是这样 是否有任何在线示例基本上显示如何进行设置 我发现了以下内容 http mojo
  • 错误:找不到模块“eslint-config-flowtype”

    我正在尝试一起使用 Webpack ESLint 和 Flow 类型 但是 当我启动 webpack dev server 时 我收到以下错误消息 奇怪的是eslint config flowtype甚至不是 NPM 中的模块 以前有人遇到
  • 将哈希表值属性导出到 CSV 文件

    我正在运行Test AdfsServerHealth Ref 问题是 输出值之一 值名称Output 是一个数组 显示为System Collection Hashtable我正在尝试找到一种方法以简洁的 Excel 格式获取此内容 例如