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)
您需要将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)
尝试这样:
$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)