我在批处理脚本中使用
nslookup.exe
来打印输入域的所有可用 IPv4 地址。但即使有多个,它也只打印出其中一个。
我认为我用
for
循环错误地解析了结果,但我似乎不知道如何修复它。
例如,如果我输入
amazon.com
或 microsoft.com
作为域名,那么我的输出如下:
Domain Name: amazon.com
IPv4 Address: 205.251.242.103
Domain Name: microsoft.com
IPv4 Address: 20.112.250.133
但是如果我直接在 cmd.exe 中执行
nslookup
,它会打印出所有可用的地址,包括 IPv4 和 IPv6:
C:\Users>nslookup amazon.com
Server: xxxxxxxxx
Address: xxx.xx.xxx.xx
Non-authoritative answer:
Name: amazon.com
Addresses: 54.239.28.85
52.94.236.248
205.251.242.103
C:\Users>nslookup microsoft.com
Server: xxxxxxxxx
Address: xxx.xx.xxx.xx
Non-authoritative answer:
Name: microsoft.com
Addresses: 2603:1030:c02:8::14
2603:1020:201:10::10f
2603:1010:3:3::5b
2603:1030:b:3::152
2603:1030:20e:3::23c
20.231.239.246
20.76.201.171
20.70.246.20
20.236.44.162
20.112.250.133
我想要仅输入的域的所有可用 IPv4 地址。
for /f "tokens=2" %%b in ('nslookup -type=A !domain_name! 2^>nul ^| findstr /C:"Address"') do (
if not "%%b"=="" (
echo Domain Name: !domain_name!
echo IPv4 Address: %%b
) else (
echo I encountered an error while looking up the domain name, or no Address records were found.
)
)
我尝试删除
findstr
,并添加 delims
,但它不起作用,因为它在打印真实 IPv4 地址之前打印了 UnKnown
作为 IPv4 地址。
我的
for
循环:
for /f "tokens=2 delims=:" %%b in ('nslookup -type=A !domain_name! 2^>nul') do (
if not "%%b"=="" (
echo Domain Name: !domain_name!
echo IPv4 Address: %%b
)
)
if defined b (
rem something was found
) else (
echo No IPv4 addresses found
)
查看输出:
Domain Name: microsoft.com
IPv4 Address: UnKnown
Domain Name: microsoft.com
IPv4 Address: 20.231.239.246
我还使用了
delims
和findstr
,创建了另一个变量ipv4_addresses
,但由于某种原因,这也不起作用。
set "ipv4_addresses="
for /f "tokens=2 delims=: " %%b in ('nslookup -type=A !domain_name! 2^>nul ^| findstr /R /C:"Address"') do (
echo Domain Name: !domain_name!
echo IPv4 Address: %%b
set "ipv4_addresses=!ipv4_addresses! %%b"
)
rem If no IPv4 addresses are found, display a message
if not defined ipv4_addresses echo No IPv4 addresses were found for !domain_name!
输出相同,只有一个 IPv4:
Domain Name: microsoft.com
IPv4 Address: 20.236.44.162
此脚本适用于像
youtube.com
或 google.com
这样只有一个 IPv4 地址的域,但不适用于具有多个 IPv4 地址的域。
这实际上是一行。过滤 IPv4 地址模式并处理第一行中的附加第一个标记:
for /f "tokens=1*" %%a in ('NSLOOKUP amazon.com 2^>nul ^|findstr /Rc:" [1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*"') do if not "%%b" == "" (echo %%b) else echo %%a
或更易读:
for /f "tokens=1*" %%a in (
'NSLOOKUP amazon.com 2^>nul ^|findstr /Rc:" [1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*"
') do (
if not "%%b" == "" (
echo %%b
) else (
echo %%a
)
)