是否可以在Powershell中重命名类型成员名称?

时间:2017-04-18 00:45:51

标签: powershell

使用PowerShell,是否有可能获取大量数据,抛入表中,然后将名称应用于标题?

问题是我有一个异步操作,从远程网络位置获取一些数据,有时头信息将首先返回,这使我很容易在我填充的表格上设置标题,但有时候并没有发生。我希望能够在查找标题时首先收集数据,然后在收集完所有数据后进行设置。

我不想迭代表中的每个对象,因为可能有数百行数据返回。我还试图确保它能够处理任意数量的标题和数据列(当然,列数始终与标题数相匹配)。

是否有办法重命名[pscustomeobject]的属性?

1 个答案:

答案 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
  }
}