批处理脚本中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
相关产品推荐
相关产品推荐

