我正在尝试解析Powershell命令以获取mac地址列表
getmac | findstr "Device" | select-string '(..-){5}' | ForEach-Object{$_ -replace '^(..-..-..-..-..-..).+$','$1'}
它给我输出像
7C-05-07-0F-F8-69
我想再添加一项检查以检查它是否以特定范围开始 如下
getmac | findstr "Device" | findstr "7C:05:07" | findstr "08:00:27" | findstr "00:50:56" | select-string '(..-){5}' | ForEach-Object{$_ -replace '^(..-..-..-..-..-..).+$','$1'}
但是findstr "Device" | findstr "7C:05:07" | findstr "08:00:27" | findstr "00:50:56"
不起作用或我在下面尝试过的操作
getmac | (findstr "Device" -or findstr "7C:05:07" -or findstr "08:00:27" -or findstr "00:50:56")
它在powershell中出错了请帮忙
答案 0 :(得分:2)
由于上一个示例中表达式不正确,您收到错误。我想你得到的错误是:Expressions are only allowed as the first element of a pipeline.
您不能以您的方式使用-or
。运算符的每一侧都将被计算为布尔值。虽然我们可以使用可能无法获得预期结果的子表达式来实现这一点。
一般来说,我建议只使用它来消除对所有findstr的需要
getmac | select-string "[-A-F0-9]{17}" -AllMatches | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value
然后我们可以使用-or
getmac | select-string "[-A-F0-9]{17}" -AllMatches |
Select-Object -ExpandProperty Matches |
Select-Object -ExpandProperty Value |
Where-Object{$_ -match "7C:05:07" -or $_ -match "08:00:27" -or $_ -match "00:50:56"}
我会用正则表达式做一些简洁的事情。
getmac | select-string "[-A-F0-9]{17}" -AllMatches |
Select-Object -ExpandProperty Matches |
Select-Object -ExpandProperty Value |
Where-Object{$_ -match "7C:05:07|08:00:27|00:50:56"}
如果必须在开头,您可以将最后一个正则表达式更改为以下内容:"^(7C:05:07|08:00:27|00:50:56)"
我还会考虑只查询WMI而不是文本解析。
Get-WmiObject win32_networkadapter | Where-Object{$_.MacAddress} | Select -ExpandProperty macaddress
答案 1 :(得分:1)
感谢马特详细解答。
我也找到了一个针对同一问题的解决方案,我想发布我的答案。
我们可以使用/c
中的findstr
选项或命令提示符中的操作和powershell打击我的方式
getmac | findstr "Device" | findstr /c:"00-15-5D" /c:"08-00-27" /c:"00-50-56" /c:"52-54-00"| select-string '(..-){5}' | ForEach-Object{$_ -replace '^(..-..-..-..-..-..).+$','$1'}
有关findstr
的详情,请参阅此链接