首页 > 解决方案 > Export-Csv 没有按我的预期工作

问题描述

我写了一个小脚本,应该将输出导出为 CSV。这是我的脚本:

$Jobs = Get-VBRJob

foreach ($Job in $Jobs) {
    $JobName = $Job.Name
    $Objects = $Job.GetObjectsInJob()
    $RestorePoints = Get-VBRRestorePoint -Backup $JobName
    $Day = $Job.ScheduleOptions.OptionsDaily.DaysSrv

    $RP = $RestorePoints.Count
    $VM = $Objects.Name

    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name "JobName" -Value $JobName
    $obj | Add-Member -MemberType NoteProperty -Name "Objects" -Value $Objects
    $obj | Add-Member -MemberType NoteProperty -Name "RestorePoints" -Value $RestorePoints
    $obj | Add-Member -MemberType NoteProperty -Name "Day" -Value $Day
    $obj | Add-Member -MemberType NoteProperty -Name "VM" -Value $VM
}
$obj | Export-Csv $path -NoType 

我通过 阅读了一些关于这样做的内容New-Object PSObject,所以我尝试了这个,但是 CSV 只有一行并返回属性的类型而不是值。只有“JobName”和“VM”工作正常。

谁能帮我将“Objects”、“RestorePoints”和“Day”的值转换为 CSV?

标签: powershellcsv

解决方案


$obj仅包含您刚刚创建的对象,因此循环完成后,该变量将保存循环中创建的最后一个对象,然后将其导出到 CSV。更好的方法是在循环中输出创建的对象并将循环输出收集到一个变量中。我还建议避免Add-Member,除非您需要将成员添加到在其他地方创建的对象。

$obj = foreach ($Job in $Jobs) {
    ...
    New-Object -Type PSObject -Property @{
        'JobName'       = $JobName
        'Objects'       = $Objects
        'RestorePoints' = $RestorePoints
        'Day'           = $Day
        'VM'            = $VM
    }
}

此外,如果您分配给新对象属性的值是对象本身,PowerShell 会将这些对象的字符串表示形式导出到 CSV,这通常是对象类的全名。如果您想要输出中的特定值,您可能需要进一步扩展这些值(例如'VM' = $VM.Name)。但是,您究竟需要做什么取决于实际的对象,所以如果不了解更多关于对象的结构,我就无能为力了。


推荐阅读