如何在 Powershell 中使用 ForEach-Object 仅获取多台 PC 的机器 IP 地址?

How can I get the machine IP address only for several PCs using ForEach-Object in Powershell?

我正在编写一个脚本,使用 ForEach 语句从多台计算机获取 IP 地址信息。问题是 IP 地址字符串 returns 额外的信息,所以为了摆脱那个信息,我 运行 这个...

Get-WmiObject win32_networkadapterconfiguration | 
    where { $_.ipaddress -like "1*" } | 
    select -ExpandProperty ipaddress | 
    select -First 1}

这对一台计算机来说没问题,但是当我将它添加到下面脚本的整个 ForEach 部分时,它 returns 我的机器的 IP 地址连接到脚本中查询的所有机器.

Get-Content $MultiActivePing | foreach {
    Get-WmiObject win32_networkadapterconfiguration -ComputerName $_ |
    where { $_.ipaddress -ne $null} | 
    select @{Expression={$_.__SErver};Label="Computer"}
      ,@{Expression={Get-WmiObject win32_networkadapterconfiguration | where { $_.ipaddress -like "1*" } | select -ExpandProperty ipaddress | select -First 1};Label="IPAddress"} `
      ,@{Expression={$_.DefaultIPGateway};Label="Gateway"} 
                                        }

所以我想知道是否有一种方法可以扩展 IP 地址的 属性,而不必在 SELECT IP 地址部分中 运行 另一个 GWMI

承认我有点困惑,因为我不知道你到底在期待什么,但我可以大胆猜测。大多数情况下,我不确定您希望 IP 地址输出是什么样的。

Get-Content $MultiActivePing | ForEach-Object {
    # Save the current computer name so we can use down the line. 
    $computer = $_
    Get-WmiObject win32_networkadapterconfiguration -ComputerName $_ |
    where { $_.ipaddress -ne $null} |
    Select @{l="IPAddress";e={$_.ipaddress | Select -First 1}},@{l="Computer";e={$computer}},DHcpenabled,macaddress
}

关于此的部分将根据您要完成的任务而有所不同:

Select @{l="IPAddress";e={$_.ipaddress | Select -First 1}}

您已经知道IP,无需再次获取。这将获取数组中的第一个 IP 并单独输出它。这是我认为您遇到问题的部分,但我不知道您如何选择要删除的信息。需要注意的是,您可能会丢失您真正想要的 IP 信息,具体取决于它出现的顺序。我也会建议这样做,这样就不会丢失任何内容:

将上面突出显示的 IP 地址的计算 属性 更改为:

@{l="IPAddresses";e={$_.ipaddress -Join ";"}}

这将获取所有 IP 并将它们转换为以分号分隔的字符串

感谢 Matt 的逻辑,我刚刚将其添加到脚本中...

,@{E={$_.ipaddress | Select -First 1};L="IPAddress"}

这是现在的样子,非常简单。解决了我的问题...

ForEach {
Get-WmiObject win32_networkadapterconfiguration -ComputerName $_ |
where { $_.ipaddress -ne $null} |
Select @{E={$_.__SErver};L="Computer"}
      ,@{E={$_.ipaddress | Select -First 1};L="IPAddress"}
      ,@{E={$_.DefaultIPGateway | Select -First 1};L="Gateway"}