如何在 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"}
我正在编写一个脚本,使用 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"}