For 循环只输出一个 nslookup 结果,当有多个时

问题描述 投票:0回答:1

我在批处理脚本中使用

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 地址的域。

windows for-loop batch-file text-parsing nslookup
1个回答
0
投票

这实际上是一行。过滤 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
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.