将 arp -g 的输出存储到 powershell 变量中

Posted

技术标签:

【中文标题】将 arp -g 的输出存储到 powershell 变量中【英文标题】:Store output from arp -g into powershell variable 【发布时间】:2019-10-27 16:48:03 【问题描述】:

我只需要存储 MAC 地址信息(物理地址)

arp -g 10.205.128.115 
output: 
Interface: 10.205.128.101 --- 0xb
  Internet Address      Physical Address      Type
  10.205.128.115        48-2a-e3-28-b0-f5     dynamic  

我只需要 48-2a-e3-28-b0-f5

这是最接近我需要的,但我相信有最简单的方法:

$macarray = @()
arp -g 10.205.128.115 | Foreach 

        $obj = New-Object PSObject -Property @
        #IP  = ($_ -split "\s+")[1]
        MAC = ($_ -split "\s+")[2]
        
IF (!($obj.MAC -eq "---" -or $obj.MAC -eq "Address" -or $obj.MAC -eq $null -or $obj.MAC -eq "ff-ff-ff-ff-ff-ff")) $macarray += $obj

$macarray






$macarray = @()
arp -g 10.205.128.115 | Foreach 

        $obj = New-Object PSObject -Property @
        #IP  = ($_ -split "\s+")[1]
        MAC = ($_ -split "\s+")[2]
        
IF (!($obj.MAC -eq "---" -or $obj.MAC -eq "Address" -or $obj.MAC -eq $null -or $obj.MAC -eq "ff-ff-ff-ff-ff-ff")) $macarray += $obj

$macarray

【问题讨论】:

【参考方案1】:

这行得通!但我认为这个解决方案是“健壮的”

$macarray = @()
arp -g 10.205.128.115 | foreach 

    ($_ -split "\s+")[2] | Where-Object -FilterScript  -Not ($_ -eq "---" -or $_ -eq "Address" -or $_ -eq $null -or $_ -eq "ff-ff-ff-ff-ff-ff") 

#foreach $i.Add($_) $i

$macarray

【讨论】:

这是为了获取网络上计算机的 MAC 吗?如果是这样,您可以使用Get-CimInstance 获取您需要的信息。【参考方案2】:

我认为你最好使用Get-CimInstanceGet-WmiObject 作为Lee_Daily 的建议,而不是尝试解析arp 命令的输出:

Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | 
    Where-Object  $_.IPAddress -match '\S+'  | 
    Select-Object @Name = 'Internet Address'; Expression = $_.IPAddress[0], 
                  @Name = 'Physical Address'; Expression = $_.MACAddress, 
                  @Name = 'Type'; Expression = if ($_.DHCPEnabled) 'dynamic' else 'static', 
                  Description

上面的输出会是这样的:

Internet Address Physical Address  Type    Description                                                         
---------------- ----------------  ----    -----------                                                         
192.168.0.14     00:24:1D:C7:38:64 dynamic Realtek RTL8168D/8111D Family PCI-E Gigabit Ethernet NIC (NDIS 6.20)
192.168.56.1     0A:00:27:00:00:0F static  VirtualBox Host-Only Ethernet Adapter

【讨论】:

对于带有 LAPS 的远程 Win10 计算机是最简单的解决方案 ARP。不过谢谢【参考方案3】: 您可以使用 RegEx 更好地解析 arp 输出, Windows 8+ / Windows Server 2012+ 具有 Get-NetNeighbor cmdlet
$IP = '10.205.128.115'

# to parse arp output
$MAC= (arp -g $IP | Select-String -Pattern '(([0-9a-f])2-)5([0-9a-f])2').Matches.Value
$MAC

# a more owerShell like approach 
$MAC = (Get-NetNeighbor $IP).LinkLayerAddress
$Mac

【讨论】:

以上是关于将 arp -g 的输出存储到 powershell 变量中的主要内容,如果未能解决你的问题,请参考以下文章

Powershell:捕获组合输出,仅错误输出,将组合输出发送到控制台

Powershell:将外部命令输出通过管道传输到另一个外部命令

将输出流以外的两个或多个 Powershell 流重定向到同一个文件

Powershell:将pracl命令的输出管道传输到数组

如何使用PowerShell将选择查询的输出从DataSet复制到日志文件?

在 PowerShell 中,如何将错误、警告、写入主机输出捕获到单个文件中?