我正在生成一个对象,其中包含一些诊断过程的结果。它具有以下结构:
ProdVersion : [string]
LastAttempted : [ordered hashtable]
LastSuccessful : [ordered hashtable]
Pings : [array of hashtables]
Ports : [array of hashtables]
Services : [array of hashtables]
$ServiceProps = [ordered]@{
ServiceName = $sName
Exists = $sExists
Disabled = $sDisabled
Status = $sStatus}
一个这样的对象表示一个CI(服务器(的数据。我想以CSV报告的"线性化"形式输出此对象,格式如下:'名称:val;名称:val;名称:val.…'其中val(如果是集合(项依次用","分隔。
最优雅的方法是什么?我正在寻找一个不绑定到我的特定对象结构的通用解决方案。
更新
现在我正在尝试这样的smth,它可以工作,但输出中不包括最后一个"服务"部分,不知道为什么-
$output = New-Object System.Text.StringBuilder
function expand ($object) {
foreach ($i in $object.keys) {
$t = $object.$i.gettype()
if ($t -in ([System.Object[]], [System.Collections.Specialized.OrderedDictionary])) {
expand $object.$i
} else {
[void]$output.Append("$i=$($object.$i);")
}
}
}
更新2
找出原因-它将$ServiceProps
(例如ServiceName
(中的键值视为[Object[]]
而不是[string]
,并尝试迭代其.Keys
,即$null
。
对象序列化是您要查找的单词。您可以使用Export-Clixml
cmdlet。它将把对象写入xml文档。另一种选择是使用ConvertTo-Json -Compress
。它将输出一行。但是,如果您需要这行完全以指定的格式,那么我想除了编写自己的函数之外,没有其他方法了。