正如标题所说,我想在Windows中将ip地址与批处理匹配,请告诉我如何做到这一点?
我看到“ findstr ”可以匹配正则表达式,如“ [0-9] ”,但“findstr”如何匹配它一到三次< / b>吗?
答案 0 :(得分:5)
由于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]*"
是的,如果还匹配像Address: 232345.534.78678.345
那样显然不是IP地址的东西。但通常ipconfig
不会吐出这样的字符串。
答案 1 :(得分:2)
FINDSTR是唯一支持正则表达式的本机批处理实用程序。但支持非常有限而且非标准。支持的唯一重复表达式是*
。此外,它最多限制为15个字符的术语(参见What are the undocumented features and limitations of the Windows FINDSTR command?)。因此,我认为不可能开发出能够精确匹配IP地址的本地批处理正则表达式。
您可以保留在本机Windows实用程序中并使用Power Shell,也可以通过CSCRIPT命令使用JScript或VBScript。这三个都有更好的正则表达式支持。
或者,您可以下载任何Unix实用程序的Windows端口,其中许多都是免费的。 GnuWin32是一个很好的资源(包括grep):http://gnuwin32.sourceforge.net/
答案 2 :(得分: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地址范围。
编辑:根据以下评论和Regular expressions in 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
在正则表达式解释中确实有限。
答案 3 :(得分:1)
如果你的findstr命令的输入不应该是 ipconfig的结果, 您可以使用以下代码行在text或csv文件中查找ip-address。
findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt
它将元字符添加到用户Joey的答案中。开头的“\&lt;” “&gt;”结尾。即使这样的字符串可能不是很常见(或非常不可能 要发生这种情况,确保没有类似ip-address格式的字符串,而是使用 返回结尾和/或开头的字母字符(例如A198.252.206.16或198.252.206.16A)。
答案 4 :(得分:0)
这将属于标题的“任何其他方法”部分,但是我在批处理命令中使用了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地址)
我可以在ms-dos命令提示符下使用findstr
命令进一步指定要在哪一行。
在这里,我需要包含字符串IP Address
的行。
netsh interface ip show config name="Ethernet" | findstr "IP Address"
这将提供以下输出:
IP Address: 169.252.27.59
然后,我可以使用for
命令,该命令使我可以分析文件(在这种情况下为多行字符串),并根据分隔符和我感兴趣的项目编号来拆分字符串的内容。
请注意,我正在寻找第三个项目(令牌= 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
)。请注意,我必须使用|
=
和^
在for
命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用set
将值分配给名为IP
的环境变量。如果您愿意,也可以只回显该值或您喜欢的任何内容。
这样,您将获得一个环境变量,并将您的首选网络适配器的IP地址分配给一个环境变量。很好,是吧?
如果您有任何改进的想法,请发表评论。