如何使用" OR"用于findstr的windows powershell命令和管道

时间:2015-10-07 14:26:29

标签: powershell cmd

我正在尝试解析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中出错了请帮忙

2 个答案:

答案 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

的详情,请参阅此链接