【发布时间】:2019-07-14 22:53:11
【问题描述】:
我有以下脚本,它从另一个脚本中获取对象并将其转换为 pscustomobject
& ".\script1.ps1" -ViewConnection "$cinput" -OutVariable xprtOut | Format-Table -Wrap
#converting xprtOut from Arraylist to pscustomobject to be used with ConvertTo-HTMLTable
$Arr = @()
foreach ($Object in $xprtOut) {
$i = -1
$arrayListCount = -($Object | gm | Where-Object {$_.MemberType -like "noteproperty"}).Count
$customObj = New-Object PSCustomObject
do {
$customObj | Add-Member -MemberType NoteProperty -Name (($Object | gm)[$($i)].Name) -Value ($Object."$(($Object | gm)[$($i)].Name)")
$i--
} while ($i -ge $arrayListCount)
$Arr += $customObj
}
效果很好,但我注意到对象的顺序发生了变化。 如何保留函数中的顺序?
我在这里尝试答案:https://stackoverflow.com/a/42300930/8397835
$Arr += [pscustomobject]$customObj
但这不起作用。我尝试将演员表放在函数的其他位置并给出错误。
ordered 属性只能在散列文字节点上指定。
我想我不确定我应该将[ordered] 或[pscutomobject] 放在函数中的什么位置,因为在我的情况下我没有@ 符号
【问题讨论】:
-
@Drew 既然你策划了这个功能,你对这个排序有什么建议吗:)
-
不要使用
New-Object&Add-Member,而是使用[ordered]$Hashtable@{}、$Hashtable.Add(),最后使用[PSCustomObject]$Hashtable,让事情保持顺序。 [咧嘴] -
@Lee_Dailey 我明白了。您介意发布这些修改的答案吗?
-
@Lee_Dailey 会是 $customObj = New-Object PSCustomObject 而不是 $customObj = New-Object PSCustomObject ....?和 $Hashtable.Add(($Object | gm)[$($i)].Name) -Value ($Object."$(($Object | gm)[$($i)].Name)") ?我会用 [PSCustomObject]$Hashtable 替换 $Arr += $customObj 吗?
-
不——不要使用
New-Object。创建一个 ordered 哈希表,遍历您的集合并将项目添加到该哈希表,然后使用 PSCO 类型加速器使用[PSCustomOBject]$Hashtable创建您的自定义对象。最后,将 PSCO 添加到您的新集合中。
标签: powershell