首页 > 解决方案 > Add-Member : 输入对象不能绑定任何参数

问题描述

我正在尝试获取打开端口的列表,然后使用 PID 查找processnameusernamevia get-username,所有这些都打包到一个数组中:

[array] $ports = get-nettcpconnection | 
    Select-object state, creationtime, localaddress, localport, owningprocess, remoteport, remoteaddress

foreach($i in $ports.owningprocess)
{
    Get-Process -Id $i -IncludeUserName | 
        Add-Member -inputobject $ports -NotePropertyMembers @{
            processname = $_.processname
            username = $_.username
        }
}

但我只是收到以下错误:

Add-Member : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
At line:5 char:1

我在这里做错了什么?还是有完全不同的更好的方法来做到这一点?

标签: powershell

解决方案


发生错误是因为您已经明确绑定$ports-InputObject- PowerShell 只能执行其中一项。

迭代$ports.OwningProcess意味着您丢失了对 individual 的引用$port,因此您需要将foreach循环更改为:

$ports = Get-NetTCPConnection |Select-Object State, CreationTime, LocalAddress, LocalPort, OwningProcess, RemotePort, RemoteAddress

foreach($port in $ports)
{
    # resolve owning process
    $process = Get-Process -Id $port.OwningProcess -IncludeUserName

    # add process details to $port
    $port |Add-Member -NotePropertyMembers @{
        ProcessName = $process.ProcessName
        UserName = $process.UserName
    }
}

# objects in $ports now have the ProcessName and UserName properties
$ports |Select-Object LocalPort,ProcessName,UserName

作为一种替代方法,您可以在调用之前立即枚举所有进程Get-NetTCPConnection并构建一个引用表,您可以在计算属性中使用Select-Object

$OwnersByID = @{}
Get-Process -IncludeUserName |ForEach-Object { $OwnersByID[$_.Id -as [uint32]] = $_ }

$ports = Get-NetTCPConnection |Select-Object State, CreationTime, LocalAddress, LocalPort, OwningProcess, RemotePort, RemoteAddress,@{Name='ProcessName';Expression={$OwnersByID[$_.OwningProcess].Name}},@{Name='UserName';Expression={$OwnersByID[$_.OwningProcess].UserName}}

推荐阅读