使用PowerShell,是否有可能获取大量数据,抛入表中,然后将名称应用于标题?
问题是我有一个异步操作,从远程网络位置获取一些数据,有时头信息将首先返回,这使我很容易在我填充的表格上设置标题,但有时候并没有发生。我希望能够在查找标题时首先收集数据,然后在收集完所有数据后进行设置。
我不想迭代表中的每个对象,因为可能有数百行数据返回。我还试图确保它能够处理任意数量的标题和数据列(当然,列数始终与标题数相匹配)。
是否有办法重命名[pscustomeobject]
的属性?
答案 0 :(得分:0)
如果标题没有首先出现,我不认为你可以避免对数据进行一些迭代 - 除非你愿意让数据的下游消费者理清'形状& #39;对象。
为此我假设一个远程调用的所有对象具有相同的结构且结构是平的。
标题出现时,将标题名称保存在数据的单独变量中。例如。在数组中 - 类似这样:
$header = @()
$data = @()
# assuming variable $remoteObject which is a psobject
If ($remoteObjIsHeader) {
$remoteObject | Get-Member -MemberType Properties | % {
$header += $_.Name
}
}
else {
$data += $remoteObject
}
一旦你拥有了所有标题,就可以开始用这样的函数推出你的新psobject。
Function Write-DataBuffer($Headers, $Data) {
foreach($item in $Data) {
$obj = New-Object -TypeName psobject
for ($i =0; $i -lt $Headers.length; $i++) {
$obj | Add-Member -MemberType NoteProperty -Name $Headers[$i] -Value $item[$i]
}
Write-Output $obj
}
}
你可以变得更加漂亮并缓冲$data
中的内容,直到标题到达,然后你只需要遍历在标题到达之前收到的行数。但是你说这是异步的,所以我不确定线程的影响。
If ($remoteObjIsHeader) {
$remoteObject | Get-Member -MemberType Properties | % {
$header += $_.Name
}
if ($data.length -gt 0) {
# header arrived after data - flush the buffer
Write-DataBuffer -Data $data
}
}
else {
if ($headers.length -gt 0) {
# have the headers just output the data
Write-DataBuffer -Data @($remoteObject)
}
else {
# don't have headers - buffer the data
$data += $remoteObject
}
}