3

    正如标题所说,我想在windows中将ip地址与批处理匹配,请告诉我该怎么做?
    我看到“ findstr ”可以与“ [0-9] ”这样的正则表达式匹配,但是“findstr”如何匹配它出现一到三次

4

5 回答 5

6

由于findstr的正则表达式支持有点……过时,您通常不能使用您在网络上找到的大多数正则表达式。以下匹配四行数字,以点分隔:

ipconfig | findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

但是,如果您只对地址感兴趣而不是子网掩码,则可能需要使用

ipconfig | findstr /r "Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"

是的,if 也会匹配Address: 232345.534.78678.345显然不是 IP 地址的东西。但通常ipconfig不会吐出这样的字符串。

于 2012-04-03T13:45:08.160 回答
2

FINDSTR 是唯一支持正则表达式的本机批处理实用程序。但是支持非常有限且不标准。唯一支持的重复表达式是*. 此外,它被限制为最多 15 个字符类术语(请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?)。因此,我认为不可能开发出精确匹配 IP 地址的本地批处理正则表达式。

您可以留在本机 Windows 实用程序中并使用 Power Shell,或者您可以通过 CSCRIPT 命令使用 JScript 或 VBScript。这三个都有更好的正则表达式支持。

或者,您可以下载任意数量的 Unix 实用程序的 Windows 端口,其中许多是免费的。GnuWin32 是一个很好的资源(包括 grep):http ://gnuwin32.sourceforge.net/

于 2012-04-03T14:06:22.070 回答
2

如果您的 findstr 命令的输入不应该是 ipconfig 的结果,您可以使用以下代码行在文本或 csv 文件中查找 ip 地址。

findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt

它为用户 Joey 的回答添加了元字符。“\<”开头, “>”结尾。即使这样的字符串可能不是很常见(或不太可能发生),这也可以确保没有类似 ip 地址格式但在结尾和/或开头带有字母字符的字符串(例如 A198.252.206。 16 或 198.252.206.16A) 被退回。

于 2013-07-11T15:14:18.767 回答
1

一个简单的正则表达式字符串将是

(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.(1?[0-9]?[0-9]|2[0-4][0-9])|25[0-5]

与允许的 IP 地址范围完全匹配。

编辑:根据下面的评论和findstr信息中的正则表达式,修改上面的正则表达式[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]以匹配 IP 地址。显然FINDSTR,正则表达式解释确实受到限制。

于 2012-04-03T13:43:00.523 回答
0

tldr;

这将属于标题的“任何其他方法”部分,但我在批处理命令中使用了 for 循环以及 findstr 来获得我想要的 IP。在我的例子中,我将 IP 设置为一个名为 IP 的环境变量。

这是命令:

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i

对于那些想知道这一切意味着什么的人,请继续阅读

例如,大多数命令ipconfig只打印出你所有的 IP 地址,我需要一个特定的地址,在我的情况下是用于我的以太网网络适配器。

netsh interface ipv4 show interfaces您可以使用该命令查看网络适配器列表。大多数人需要 Wi-Fi 或以太网。

您将在命令提示符的输出中看到这样的表:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 15          25        1500  connected     Ethernet
 17        5000        1500  connected     vEthernet (Default Switch)
 32          15        1500  connected     vEthernet (DockerNAT)

在名称栏中,您应该找到您想要的网络适配器(即以太网、Wi-Fi 等)。

如前所述,我对Ethernet我的情况很感兴趣。

要获取该适配器的 IP,我们可以使用 netsh 命令:

netsh interface ip show config name="Ethernet"

这给了我们这个输出:

Configuration for interface "Ethernet"
    DHCP enabled:                         Yes
    IP Address:                           169.252.27.59
    Subnet Prefix:                        169.252.0.0/16 (mask 255.255.0.0)
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  None
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None

(出于安全原因,我伪造了上面的实际 IP 号)

findstr我可以使用ms-dos 命令提示符中的命令进一步指定我想要的行。在这里,我想要包含字符串的行IP Address

netsh interface ip show config name="Ethernet" | findstr "IP Address"

这给出了以下输出:

 IP Address:                           169.252.27.59

然后,我可以使用for允许我解析文件(或在这种情况下为多行字符串)的命令,并根据分隔符和我感兴趣的项目编号拆分字符串的内容。

请注意,我正在寻找第三项 (tokens=3),并且我正在使用空格字符和:分隔符 ( delims=: )。

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do set IP=%i

循环中的每个值或标记都作为变量 %i 打印出来,但我只对第三个“标记”或项目(因此tokens=3)感兴趣。请注意,我必须逃避|and=使用^

for命令的末尾,您可以指定一个命令以使用返回的内容运行。在这种情况下,我使用set将值分配给名为IP. 如果您愿意,您也可以只回显该值或您喜欢的任何内容。

这样,您将获得一个环境变量,其中将首选网络适配器的 IP 地址分配给环境变量。很整洁吧?

如果您有任何改进的想法,请发表评论。

于 2019-11-23T03:50:53.827 回答