使用PowerShell的Add-Member会导致错误

res*_*101 6 powershell wmi pipeline object

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

"Add-Member:由于一个或多个缺少
必需参数而无法处理命令:InputObject.
+ $ obj = Add-Member <<<< -MemberType NoteProperty -Name ComputerName -Value $ ComputerName
+ CategoryInfo:InvalidArgument:(:) [Add -Member],ParameterBindingException
+ FullyQualifiedErrorId:MissingMandatoryParameter,Microsoft.PowerShell.Commands.AddMemberCommand"

脚本

# Receives the computer name and stores the required results in $obj.
Function WorkerNetworkAdaptMacAddress {
    Param($ComputerName)

    $colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $ComputerName -filter "IpEnabled = TRUE"
    $obj = New-Object -TypeName PSobject
    ForEach ($objItem in $colItems)
    {
        $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
    }
    Write-Output $obj
}

# Receives the computer name and passes it to WorkerNetworkAdaptMacAddress.

Function Get-NetworkAdaptMacAddress {
    begin {}
    process{
        WorkerNetworkAdaptMacAddress -computername $_
    }
    end {}
}

# Passes a computer name to get-networkAdaptMacAddress
'tbh00363' | Get-NetworkAdaptMacAddress
Run Code Online (Sandbox Code Playgroud)

Sha*_*evy 7

您需要将PSObject创建移动到循环中.否则,您将收到对象上已存在属性的错误.

其次,您需要告诉Add-Member操作哪个对象.您可以通过将对象传递给cmdlet或在InputObject参数上指定它来执行此操作.最后,通过指定PassThru上次Add-Member调用的开关将对象返回到管道:

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
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用参数简化流程:New-Object's -Property

Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ComputerName -Filter "IpEnabled=TRUE" | Foreach-Object {
    New-Object -TypeName PSobject -Property @{
        ComputerName=$ComputerName
        MacAddress=$_.MacAddress
        IPAddress=$_.IpAddress
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用Select-Object:

Get-WmiObject ... | Select-Object @{n='ComputerName';e={$_.__SERVER}},MacAddress,IpAddress
Run Code Online (Sandbox Code Playgroud)


CB.*_*CB. 3

尝试这样:

$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
Run Code Online (Sandbox Code Playgroud)