正如标题所述,我想在Windows中将IP地址与批次匹配,请告诉我该怎么做?我看到“ findstr”可以与“ [[0-9]”等正则表达式匹配,但是“ findstr”如何匹配它呢?[[一到三倍?
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
不会吐出这样的字符串。
*
。此外,它最多限制为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/
不应是 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)。
(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
确实在正则表达式解释中受到限制。
这里是命令:
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address" ^| findstr [0-9]') 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地址number)我可以在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" ^| findstr [0-9]') do set IP=%i
循环中的每个值或令牌都作为变量%i打印出来,但是我只对第三个“令牌”或项目感兴趣(因此转义tokens=3
)。请注意,我必须使用|
=
和^
for
命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用set
将值分配给名为IP
的环境变量。如果您愿意,也可以仅回显该值或您想要的任何内容。这样,您将获得一个环境变量,并将您的首选网络适配器的IP地址分配给一个环境变量。很好,是吧?
如果您有任何改进的想法,请发表评论。