Object 使用PowerShell';s添加成员将导致错误

Object 使用PowerShell';s添加成员将导致错误,object,powershell,wmi,pipeline,Object,Powershell,Wmi,Pipeline,为什么下面的脚本会出现以下错误 “添加成员:无法处理命令,因为缺少一个或多个 必需参数:InputObject. +$obj=addmember首先,您需要通过管道将属性添加到指定的输入对象。 然后,如果希望cmdlet返回修改过的对象,则应使用-PassThru参数调用它: 使用PassThru参数时,Add Member返回 新扩展的对象。否则,此cmdlet不会生成任何 输出 下面是您的脚本的一个稍加修改的版本: $obj = $objItem | Add-Member -MemberTy

为什么下面的脚本会出现以下错误

“添加成员:无法处理命令,因为缺少一个或多个
必需参数:InputObject.

+$obj=addmember首先,您需要通过管道将属性添加到指定的输入对象。
然后,如果希望cmdlet返回修改过的对象,则应使用
-PassThru
参数调用它:

使用PassThru参数时,Add Member返回 新扩展的对象。否则,此cmdlet不会生成任何 输出

下面是您的脚本的一个稍加修改的版本:

$obj = $objItem | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName -PassThru
但是,由于您不需要将输出对象保存在新变量中,因此也可以简单地说:

$obj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName
试着这样做:

$objcol = @()
ForEach ($objItem in $colItems)
{
    $obj = New-Object System.Object
    $obj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName
    $obj | Add-Member -MemberType NoteProperty -Name MacAddress -Value $objItem.MacAddress
    $obj | Add-Member -MemberType NoteProperty -Name IPAdress -Value $objitem.IpAddress
    $objcol += $obj
}
Write-Output $objcol
您需要将创建移动到循环中。否则,您将得到错误,即对象上已经存在属性

其次,您需要告诉要在哪个对象上操作。您可以通过将对象管道化到cmdlet,或者通过在
InputObject
参数中指定它来完成操作。最后,通过在最后一次
Add Member
调用中指定
PassThru
开关,将对象返回到管道:

ForEach ($objItem in $colItems)
{
    $obj = New-Object -TypeName PSobject
    Add-Member -InputObject $obj -MemberType NoteProperty -Name ComputerName -Value $ComputerName
    Add-Member -InputObject $obj -MemberType NoteProperty -Name MacAddress -Value $objItem.MacAddress
    Add-Member -InputObject $obj -MemberType NoteProperty -Name IPAddress -Value $objitem.IpAddress -PassThru
}
或者,您可以使用
-Property
参数简化流程:

Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName -Filter "IpEnabled=TRUE" | Foreach-Object {
    New-Object -TypeName PSobject -Property @{
        ComputerName=$ComputerName
        MacAddress=$_.MacAddress
        IPAddress=$_.IpAddress
    }
}
或使用:


正如Enrico、Shay和Christian所指出的,您应该通过将对象管道化到
Add Member
或在
InputObject
参数上明确指定对象来指定
Add Member
操作的对象。当使用
Add Member
添加多个成员时,我通常会添加
PassThru切换以避免重复InputObject并提供视觉提示

ForEach ($objItem in $colItems) {
  $obj = New-Object PSobject
  $obj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName -PassThru ` 
       | Add-Member -MemberType NoteProperty -Name MacAddress -Value $objItem.MacAddress -PassThru `
       | Add-Member -MemberType NoteProperty -Name IPAdress -Value $objitem.IpAddress -PassThru
}

将的结果指定给变量,而不是将其添加到
$obj
中的属性集合

而不是

$obj = Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName
试试这个:

Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName -inputObject $obj

在“$Objule= @()”中,“@”符号使用了这个脚本,它处理得很好。这个脚本与其他脚本相比更适合我的理解。一个问题,为什么“$Obji”而不是“$Obj=”?将成员类型添加到对象中,你需要管而不是分配。读这里。如果你认为这个答案好,就接受它。谢谢。
$obj = Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName
Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName -inputObject $obj