PowerShell Export-Csv仅获取最后一行

时间:2016-07-01 00:25:05

标签: powershell powershell-v2.0 export-to-excel psobject

我知道之前已经问过这个问题,但是我很难将其他人的解决方案应用到我的情况中。请提供您的答案的概念和技术(代码)解释,因为我需要了解它是如何工作的,所以我不必再次询问不同的场景。 :)

问题:如何让我导出PSObject中的所有行,为什么它目前只导出最后一行? (请记住我只是在PS 2.0上

$d = Get-SPDatabase | Sort-Object DiskSizeRequired -desc
$d | %{
    #Report
    $t = New-Object PSObject
    $t | Add-Member NoteProperty "Size (MB)"([string]("{0:N0}" -f ($_.DiskSizeRequired / 1MB)) + " MB")
    $t | Add-Member NoteProperty "Database"($_.Name)
    Write-Output $t
}
#Save Report to Tab Delimited File on the Desktop
$t | Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd")) -Delimiter `t -Encoding UTF8 -NoTypeInformation

以上是特定于SharePoint的脚本,但我希望相同的概念应适用于涉及PSObject输出表格数据的任何情况。是的,我想将输出写入控制台以及文件。

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,$ t的值永远不会保存在数组或管道中。

因此,为了解决这个问题,我将假设您要查看值,并将管道上的值仅转到Export-Csv。我没有PowerShell 2.0可供测试,但我知道HashTables可用

$d = Get-SPDatabase | Sort-Object disksizerequired -desc
$d | %{
    #Report
    # We don't really need a PSObject, since it's just a hashtable/dictionary anyway
    $t = @{ 
     "Size (MB)" = '{0:N0} MB' -f ($_.DiskSizeRequired / 1MB)
     "Database" = $_.Name
    }
    # Write to pipeline
    Write-Output $t
    # Write to console host
    Write-Host $t
} | # move pipe here, which will feed the pipeline output to the next non-commented command
#Save Report to Tab Delimited File on the Desktop
Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd")) -Delimiter `t -Encoding UTF8 -NoTypeInformation

答案 1 :(得分:0)

经过大量的游戏(并了解更多有关PS的信息)后,我决定采用以下解决方案。感谢@Eris让我指出了正确的方向。

$t = @() #Reporting Table
$d = Get-SPDatabase | Sort-Object DiskSizeRequired -desc
$d | %{
    #Report
    $t += New-Object PSObject -Property @{
        "Size (MB)" = "{0:N0} MB" -f ($_.DiskSizeRequired / 1MB)
        "Database" = $_.Name
    } | Select "Size (MB)","Database"
}
$t
#Save Report to Tab Delimited File on the Desktop
$t | Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd HH-mm-ss")) -Delimiter `t -Encoding UTF8 -NoTypeInformation

注意:它可能不是性能最佳的解决方案(我可以对此提出建议),但它会在控制台和文件中生成我想要的输出。 ;)