Использование Add-Member PowerShell приводит к ошибке - PullRequest
6 голосов
/ 25 января 2012

Почему в приведенном ниже сценарии возникает следующая ошибка?

"Add-Member: не удается обработать команду из-за одного или нескольких отсутствующихобязательные параметры: InputObject.+ $ obj = Add-Member <<<< -MemberType NoteProperty -Name ComputerName -Value $ ComputerName+ CategoryInfo: InvalidArgument: (:) [Add-Member], ParameterBindingException+ FullyQualifiedErrorId: MissingMandatoryParameter, Microsoft.PowerShell.Commands.AddMemberCommand "</p>

Скрипт

# 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

Ответы [ 5 ]

7 голосов
/ 25 января 2012

Вам необходимо переместить создание PSObject в цикл. В противном случае вы получите ошибки, что свойства уже существуют для объекта.

Во-вторых, вам нужно указать Add-Member, на каком объекте работать. Это можно сделать, передав объект в командлет или указав его в параметре 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
}

В качестве альтернативы вы можете упростить процесс с помощью параметра 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
    }
}

Или с помощью Select-Object:

Get-WmiObject ... | Select-Object @{n='ComputerName';e={$_.__SERVER}},MacAddress,IpAddress
4 голосов
/ 25 января 2012

Сначала необходимо указать входной объект, к которому свойство должно быть добавлено трубопроводом в командлет Add-Member .
Затем, если вы хотите, чтобы командлет возвратил измененный объект, вы должны вызвать его с аргументом -PassThru:

Когда вы используете параметр PassThru, Add-Member возвращает недавно расширенный объект. В противном случае этот командлет не создает выход.

Вот немного измененная версия вашего скрипта:

$obj = $objItem | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName -PassThru

Однако, поскольку в вашем случае вам не нужно сохранять выходной объект в новой переменной, вы также можете просто сказать:

$obj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerName
3 голосов
/ 25 января 2012

Попробуй так:

$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
1 голос
/ 25 января 2012

Как указали Энрико, Шей и Кристиан, вы должны указать объект, с которым работает Add-Member, либо связав объект с Add-Member, либо явно указав объект в параметре InputObject.При добавлении нескольких членов с помощью 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
}
0 голосов
/ 26 сентября 2012

Вы присваиваете переменную Add-Member, а не добавляете ее в коллекцию свойств в $obj.

Вместо

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

Попробуйте это:

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