2017-04-18 78 views
0

使用PowerShell,是否有可能獲取大量數據,拋入表中,然後將名稱應用於標題?是否有可能在Poweshell中重命名類型成員名稱?

問題是我有一個異步操作從遠程網絡位置獲取一些數據,有時候頭信息會首先返回,這使得在我正在填充的表上設置頭文件非常容易,但是有時候不會發生。我希望能夠在查找標題時首先收集數據,然後在收集完所有數據後進行設置。

我不希望迭代表中的每個對象,因爲可能會有數百行數據回來。我也試圖確保它足夠通用,它可以處理任意數量的標題和數據列(當然,列的數量總是與標題的數量相匹配)。

難道沒有辦法重命名[pscustomeobject]的屬性嗎?

回答

0

我不認爲你可以避免對數據進行一些迭代,如果頭部不是第一個 - 除非你願意數據的下游消費者來整理對象的「形狀」。

爲此,我假設一個遠程調用的所有對象具有相同的結構,並且結構是平坦的。

當標題出現時,將標題名稱保存到數據的單獨變量中。例如。陣列中的 - 這樣的事情:

$header = @() 
$data = @() 

# assuming variable $remoteObject which is a psobject 

If ($remoteObjIsHeader) { 
    $remoteObject | Get-Member -MemberType Properties | % { 
    $header += $_.Name 
    } 
} 
else { 

    $data += $remoteObject 
} 

一旦你擁有所有你可以開始使用這樣的功能,推出新的psobjects頭。

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 
    } 
} 
相關問題