Powershell并向csv写入一个对象数组

时间:2016-09-07 20:42:10

标签: powershell csv

下面我有一个脚本循环遍历服务器列表,远程访问它们,抓取一些数据并将其写入csv文件:

$results = @()
$serverList = Get-Content C:\Test\Servers.txt
foreach ($server in $serverList) {

if((Test-Connection -Cn $server -BufferSize 16 -Count 1 -ea 0 -quiet))
{

    $myobj = Get-ChildItem ...
   Write-Host $myobj.Name

     $result =  New-object PSObject
     $result | Add-member -type Noteproperty -Name ServerName $server.ToString()
     $result | Add-member -type Noteproperty -Name MyValue -Value $myobj.Name

     Write-Host $result

     $results += $result
   }
}
$results | export-csv -Path c:\Test\Output.csv 

上面将2列写入csv文件,第一列是正确显示的服务器名称,但第二列获取System.Object[]的值,即使上面Write-Host $myobj.Name输出正确的值。如何修复我的代码以在csv文件中显示正确的值?

2 个答案:

答案 0 :(得分:1)

尝试将$ myobj.Name强制转换为字符串并查看它是否有效:

[string]$myobj.Name

答案 1 :(得分:0)

原因是$myobj.Name是一个名字数组。当您只显示数组时,PowerShell将显示该数组的每个元素。但是当你显示一个对象数组时,每个对象都有一个属性是一个数组,那么每一行都有一个包含多个对象的列,所以它只显示了这个类型。

您必须决定在CSV中如何表示这一点,以便您可以适当地对其进行转换。您是否希望该列包含以换行符分隔的项目列表,以分号分隔的列表等?

| ServerName | Item1;Item2;Item3 |

这种方式非常简单,因为您只需将数组转换为单个[string](带分号的示例):

$result | Add-member -type Noteproperty -Name MyValue -Value ($myobj.Name -join ';')

要模仿您使用Write-Host看到的内容,请使用Out-String

$result | Add-member -type Noteproperty -Name MyValue -Value ($myobj.Name | Out-String)

或者,您是否要根据该列中的项目数重复每一行?

| ServerName | Item1 |
| ServerName | Item2 |
| ServerName | Item3 |

这种方式不那么严格,因为你必须为每个项目生成一个新对象,但它是可行的。

最终,你如何实现各种结果取决于你想做什么。