You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本中For循环仅输出单个nslookup IPv4结果的问题

批量获取域名所有IPv4地址的批处理脚本修复方案

我在批处理脚本中使用nslookup.exe查询输入域名的所有可用IPv4地址,但即使存在多个地址,脚本也仅输出其中一个。直接在cmd.exe中执行nslookup能显示所有地址,但脚本的for循环解析逻辑存在问题,无法捕获全部结果。

问题现象

输入amazon.com或microsoft.com时,脚本输出仅包含单个IPv4地址:

Domain Name: amazon.com
IPv4 Address: 205.251.242.103
Domain Name: microsoft.com
IPv4 Address: 20.112.250.133

而直接在cmd中执行nslookup能返回全部地址(含IPv4和IPv6):

执行nslookup amazon.com的输出:

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

执行nslookup microsoft.com的输出:

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

尝试过的脚本及问题

方案1:用findstr过滤Address行

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.
    )
)

问题:仅输出单个IPv4地址,无法捕获Addresses:后的多行结果。

方案2:移除findstr,用delims分割

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
)

问题:错误将UnKnown当作IPv4地址输出:

Domain Name: microsoft.com
IPv4 Address:  UnKnown
Domain Name: microsoft.com
IPv4 Address:  20.231.239.246

方案3:结合delims和findstr,收集地址到变量

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

修复后的脚本

问题根源在于nslookup多地址行仅以Addresses:开头,后续地址无Address关键字,之前的findstr过滤掉了这些行;同时需区分IPv4和IPv6地址,避免混入无关结果。

修复后的脚本:

@echo off
setlocal enabledelayedexpansion

set "domain_name=%~1"
if not defined domain_name (
    echo Usage: %0 ^<domain_name^>
    exit /b 1
)

echo Domain Name: !domain_name!
echo IPv4 Addresses:
set "found=0"

for /f "skip=4 tokens=*" %%a in ('nslookup -type=A !domain_name! 2^>nul') do (
    rem 匹配纯IPv4格式的行,过滤无关内容
    echo "%%a" | findstr /R "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$" >nul
    if not errorlevel 1 (
        echo - %%a
        set "found=1"
    )
)

if !found! equ 0 (
    echo No IPv4 addresses found for !domain_name!
)

endlocal

脚本说明

  • skip=4:跳过nslookup输出的前4行服务器信息,直接处理结果部分
  • findstr正则匹配:仅保留纯IPv4格式的行,过滤掉Addresses:、IPv6及空行
  • enabledelayedexpansion:确保循环内变量正常更新

测试输出示例:

Domain Name: amazon.com
IPv4 Addresses:
- 54.239.28.85
- 52.94.236.248
- 205.251.242.103

内容的提问来源于stack exchange,提问作者Nelie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:45:17