【问题标题】:PowerShell Export-Csv Picks Up Last Row OnlyPowerShell Export-Csv 仅提取最后一行
【发布时间】:2016-07-01 00:25:05
【问题描述】:

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

问题:如何让这个导出我的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 以输出表格数据的情况。是的,我想同时将输出写入控制台和文件。

【问题讨论】:

  • 您确实意识到您 write-output $t 为每个项目,但永远不要管它或保存它,所以唯一剩下的就是最后一个?
  • 嗯,我明白你的意思,但我不知道如何解决它,这就是我在这里的原因。我已经尝试了很多东西,但到目前为止没有任何效果。

标签: powershell powershell-2.0 export-to-excel psobject


【解决方案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

【讨论】:

  • 好的,这似乎是在正确的方向,但Write-Host 行只是吐出一堆数组,而不是我想要的表格格式样式。
  • @Chiramisu 我将其更改为使用哈希表,它应该可以正确写入,但是,我目前没有可用于测试的 powershell 2.0。
  • 我在主机中返回System.Collections.DictionaryEntry System.Collections.DictionaryEntry,以及许多带有一些Hashtable+KeyCollection 和其他数据的额外字段。您认为不使用PSObject 更好吗?我读过在 TechNet 上使用它,但我对其他选择持开放态度。 ;)
  • 我会直接索引到您返回的对象。这是一个 powershell cmdlet,因此他们已经为您完成了工作。
  • 感谢您的反馈。我添加了受您启发的自己的解决方案。 ^.^
【解决方案2】:

在玩了很多游戏之后(并了解了更多关于 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

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

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2018-02-08
    • 2015-05-08
    相关资源
    最近更新 更多