Powershell 网络设备信息

Powershell Network Device Info

我正在制作一个 Powershell CmdLet,其中一个功能是从网络设备获取信息

我只希望它输出设备主机名,以及设备是否具有连接性。

这是我当前的代码:

$devlist = arp -a

    $devlength = $devlist.Length - 1

foreach($i in 3..$devlength){
    $devlist[$i] = $devlist[$i].Substring(0,24) | ForEach-Object { $_ -replace ' ','' }
    ping -n 1 -a $devlist[$i]
}

我希望输出格式是这样的:

设备主机名(如果收到)|设备IP地址 |具有连接性(yes/no)

您可以尝试以下几行:

(arp -a | Select-Object -skip 10).Trim() -replace "(\s+){3}",","  |
    ConvertFrom-Csv | 
    ForEach-Object -Process `
    {
        [PSCustomObject]@{
            IPAddress = $_.{Internet Address}
            HostName  = (Resolve-DnsName $_.{Internet Address} -ErrorAction SilentlyContinue).NameHost
            Status    = if(Test-Connection -ComputerName $_.{Internet Address} -Count 1 -Quiet) {'Online'} else {'Offline'}
        }       

    }

我采用的方法是将整个返回值转换为 object 以使其更易于使用。

编辑: 如果您想让其他用户可以访问它,您必须考虑他们的 Arp Table 是如何设置的,以及有多少接口。因此,尝试猜测 headers 列的起始位置并不是最佳解决方案。因此,您可以采取以下措施来解决这个问题:

((arp -a).Trim().Where{$_ -match "^\d+"}) -replace "\s+","," | 
    ConvertFrom-Csv -Header "IPAddress","MACAddress","Type" |
    ForEach-Object -Process `
        {
            [PSCustomObject]@{
                IPAddress = $_.IPAddress
                HostName  = (Resolve-DnsName $_.IPAddress -ErrorAction SilentlyContinue).NameHost
                Status    = if (Test-Connection -ComputerName $_.IPAddress -Count 1 -Quiet) {'Online'} else {'Offline'}
            }       
        }
  • 仅返回 个 IP,您可以缩小选择范围,将转换为 csv.
  • 然后,添加您自己的 headers 将允许您将所有接口合并为一个 csv,我们可以将其转换为 objects。