下面我有一个脚本循环遍历服务器列表,远程访问它们,抓取一些数据并将其写入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文件中显示正确的值?
答案 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 |
这种方式不那么严格,因为你必须为每个项目生成一个新对象,但它是可行的。
最终,你如何实现各种结果取决于你想做什么。