gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:09:00 25 4
gpt4 key购买 nike

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

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

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

Name    Result  Detail  OutputTestServiceAccountProperties    Pass    "" System.Collections.Hashtable

But PowerShell displays:

Name             : TestServiceAccountPropertiesResult           : PassDetail           :Output           : {AdfsServiceAccount, AdfsServiceAccountDisabled, AdfsServiceAccountLockedOut,                   AdfsServiceAccountPwdExpired...}ExceptionMessage :

The actual command I'm running is:

$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 输出中工作得相当好。


由于 CSV 是一种文本格式PowerShell 通过调用 .ToString() 序列化要导出的对象方法

复杂对象,例如 [hashtable]实例通常只为 System.Collections.Hashtable 生成它们的完整类型名称 ( .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 中具有相同的哈希表结构属性,您可以尝试扁平化哈希表,方法是使它的条目列在它们自己的权利中,但听起来情况并非如此。

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

您可以使用 Select-Object 执行此操作和一个为您执行转换的计算属性,但您需要决定在 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

有关创建计算的 prop2 的哈希表格式的说明属性(property),见this answer我的。

以上结果:

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

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


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

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

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

$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

上面的结果如下,表明哈希表条目变成了它们自己的列,nameID :

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

如果您预先知道键名,则需要更高级的技术:

# 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

这会产生与前一个命令相同的输出,其中包含固定的计算属性列表。

关于powershell - 将哈希表值属性导出到 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49276451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com