Powershell:添加成员:无法添加名为“”的成员,因为具有该名称的成员已存在

Powershell:添加成员:无法添加名为“”的成员,因为具有该名称的成员已存在,powershell,csv,Powershell,Csv,我正在尝试使用PowerShell和racadm从Dell服务器获取一些信息。下面是脚本,我无法附加新的机箱/刀片信息 我尝试改为选择对象,但导出Csv不显示值,而是显示为System.Object[] 看起来您没有正确解析racadm.exe的输出,但在不知道它看起来是什么的情况下,无法判断。您确信$output只包含一个非空行,其中包含您感兴趣的数据吗?否则,$output{}中的foreach$行将尝试添加相同的属性名两次。你可以加入一个中断声明,以确保不会发生这种情况 $output =

我正在尝试使用PowerShell和racadm从Dell服务器获取一些信息。下面是脚本,我无法附加新的机箱/刀片信息

我尝试改为选择对象,但导出Csv不显示值,而是显示为System.Object[]


看起来您没有正确解析racadm.exe的输出,但在不知道它看起来是什么的情况下,无法判断。

您确信$output只包含一个非空行,其中包含您感兴趣的数据吗?否则,$output{}中的foreach$行将尝试添加相同的属性名两次。你可以加入一个中断声明,以确保不会发生这种情况

$output = & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getchassiname | select -Skip 8
foreach ($line in $output) {
    if ($line -ne "") {
        $line = $line -split '\s+'
        $object | add-member -MemberType NoteProperty -Name "Chassis Name" -value $line[0]
        break
    }
}
要处理属性已存在的情况,请尝试以下操作:

$prop = 'ChassisName'
if ($object.psobject.properties[$prop]) {
    $object.$prop += $line[0]
}
else {
    $object | add-member -MemberType NoteProperty -Name $prop -value $line[0]
}
顺便说一句,删除属性名称中的空格,让您的生活更轻松一点:-

更新:我没有racadm.exe运行,所以我猜测它的输出。试试这个:

$MyCollection = @()
foreach ($ip in $ipchbld) {
    $object = New-Object PSObject -Property @{
                  ChassisSlot=$ip.Chassis_Slot
                  ChassisIP=$ip.DRAC_IP
                  ChassisName=''
                  ChassisSvcTag=@('')
                  CMC=@('')
                  CMCVersion=@('')}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getchassisname | 
        Select -Skip 8 | Where {$_} | 
        Foreach {$object.ChassisName = ($_ -replace '\s+',',' -split ',')[0]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getsvctag | 
        Select -Skip 8 | Where {$_ -match 'Chassis'} | 
        Foreach {$object.ChassisSvcTag += ($_ -replace '\s+',',' -split ',')[1]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getversion | 
        Select -Skip 60 | Where {$_} | 
        Foreach {$object.CMC += ($_ -replace '\s+',',' -split ',')[0]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getversion | 
        Select -Skip 60 | Where {$_} | 
        Foreach {$object.CMCVersion += ($_ -replace '\s+',',' -split ',')[1]}

    $MyCollection += $object
}

$MyCollection
$MyCollection | Export-Csv "C:\Users\FWReport\CHBLD.csv" -UseCulture -NoTypeInformation 

输出正常,因为第一行显示正确,但第二行未被添加,错误为-Add Member:无法添加名称为的成员,因为具有该名称的成员已存在。如果您仍不想覆盖该成员,请使用Force参数覆盖该成员。以下是csv机箱插槽、DRAC IP、机箱服务标签、CMC、CMC版本、刀片插槽、刀片名称、刀片类型、刀片服务标签、BIOS、iDRAC、统一服务器配置器、32位诊断、操作系统驱动程序包、NIC类型、NIC FW版本、CPLD版本、,iKVM FW版本机箱,x.x.x.x,xxxxx,cmc-1,4.11.A01.201205162137,1,server.domain.com,PowerEdge,xxxx,6.3.0,3.42,1.5.5.275157A0,6.4.0.17,NIC Broadcom,7.2.20,1.0.3,01.00.01.01,然后它在添加成员无法添加错误的情况下不断失败谢谢Keith,是的,您是对的$output将为$ipchbld{}中的foreach$ip的每个循环包含16行刀片,为cmc包含2行,因此是的,$output将为这些循环的每个循环以及成员刀片插槽之后的每个$output包含16行。中断将跳过下一个刀片服务器,并且只记录机箱中单个刀片服务器的数据,但是当拉动机箱获取数据时,我将再次开始获取错误。我想向同一属性添加数据行。我该怎么做呢?所以我想要的是,对于每个新刀片,它应该能够在现有列中添加一个新行。然后,当它获取新机箱的信息时,它应该添加到该行。我只需要添加成员在同一标题下现有行的下方添加新行,从一个空行开始。我真的很感谢你们看一看并试图帮助我。我真的很感谢你给我的提示。基思,谢谢你。我尝试了你的建议,请看下面我的答案。我确实删除了空格:-。一路学习-
$MyCollection = @()
foreach ($ip in $ipchbld) {
    $object = New-Object PSObject -Property @{
                  ChassisSlot=$ip.Chassis_Slot
                  ChassisIP=$ip.DRAC_IP
                  ChassisName=''
                  ChassisSvcTag=@('')
                  CMC=@('')
                  CMCVersion=@('')}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getchassisname | 
        Select -Skip 8 | Where {$_} | 
        Foreach {$object.ChassisName = ($_ -replace '\s+',',' -split ',')[0]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getsvctag | 
        Select -Skip 8 | Where {$_ -match 'Chassis'} | 
        Foreach {$object.ChassisSvcTag += ($_ -replace '\s+',',' -split ',')[1]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getversion | 
        Select -Skip 60 | Where {$_} | 
        Foreach {$object.CMC += ($_ -replace '\s+',',' -split ',')[0]}

    & $racadmpath\racadm.exe -r $ip.DRAC_IP -u $username -p $pass getversion | 
        Select -Skip 60 | Where {$_} | 
        Foreach {$object.CMCVersion += ($_ -replace '\s+',',' -split ',')[1]}

    $MyCollection += $object
}

$MyCollection
$MyCollection | Export-Csv "C:\Users\FWReport\CHBLD.csv" -UseCulture -NoTypeInformation