正如标题所述,我想在Windows中使用批处理匹配IP地址,请告诉我该如何做?
我知道“findstr”可以匹配类似于“[0-9]”的正则表达式,但是如何使“findstr”匹配出现一到三次?
正如标题所述,我想在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
不会输出这样的字符串。
...
这样的字符串。 - Joey如果你的findstr命令的输入不应该是ipconfig的结果,那么你可以使用以下代码行在文本或csv文件中查找IP地址。
findstr /r "\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>" filename.txt
echo %3 | findstr "your-regex" > %tmp%\tmp.txt
然后 set /p ip<%tmp%\tmp.txt
只有当它通过正则表达式时才设置该变量。谢谢! - Loduwijk*
的重复表达式。此外,它仅限于最多15个字符类项(请参见Windows FINDSTR命令的未记录功能和限制是什么?)。因此,我认为不可能开发出一个原生批处理正则表达式来精确匹配IP地址。这将属于标题中的“任何其他方法”部分,但我在批处理命令中使用了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地址,而我需要一个特定的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)
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
findstr
命令进一步指定我想要的行。在这里,我想要包含字符串IP地址
的行。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
)。请注意,我必须使用^
转义|
和=
在for
命令的末尾,您可以指定要运行的命令以返回内容。在这种情况下,我正在使用set
将该值分配给名为IP
的环境变量。如果您愿意,您也可以仅回显该值或任何您喜欢的内容。
有了这个,您就可以获得一个环境变量,其中包含分配给环境变量的首选网络适配器的IP地址。相当不错,是吗?
如果您有任何改进的想法,请留言。
(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
在正则表达式解释方面确实有限。
1.2.3.4
。 - peet
findstr
不可能实现。您可能需要添加您正在使用的cmd.exe
版本。这些工具已经在“最近”得到了相当大的更新。 - 0xC0000022Lfindstr
完全独立于cmd
版本,毕竟它是一个单独的程序。 (b) 据我所知,自 Windows 2000 以来,cmd
就没有更新过。 - Joey