我想编写一个 CMD 脚本来自动检查一组域的 MX 记录(存储在 TXT 文件中)以用于报告目的。
当我nslookup
对单个域执行此操作时,没有问题:
当我使用我的脚本时:
@echo off
setlocal enabledelayedexpansion
set "inputFile=domains.txt"
set "outputFile=mx_results.txt"
echo. > %outputFile%
for /f "delims=" %%i in (%inputFile%) do (
for /f "delims=" %%j in ('nslookup -q=mx %%i') do (
set "result=%%j"
)
echo !result! >> %outputFile%
我收到一条错误消息:*** Request to UnKnown timed-out
domains.txt文件包含以下三个测试域:
gmail.com
apple.com
microsoft.com
是不是脚本有问题,或者是什么问题?
编辑1: 我听从了建议并创建了一个新的答案。
答案1
是不是剧本有问题?
有几个错误:
您的括号不匹配(缺少
)
。echo !result! >> %outputFile%
是在错误的位置(它应该在前一个之后,echo
否则你只能得到循环中的最后一行输出for
)。您需要
=
在q=mx
使用时退出^
。findstr
产生一些您可能不想要的输出(例如Non-authoritative answer:
。
尝试以下脚本:
@echo off
rem avoid polluting global envoronment space
setlocal enabledelayedexpansion
set "inputFile=domains.txt"
set "outputFile=mx_results.txt"
echo. > %outputFile%
for /f "delims=" %%i in (%inputFile%) do (
for /f "skip=1 delims=" %%j in ('nslookup -q^=mx %%i 2^>nul ^| find "MX"') do (
set "result=%%j"
echo !result! >> %outputFile%
)
)
rem type %outputFile%
endlocal
输出:
gmail.com MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com
gmail.com MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
apple.com MX preference = 20, mail exchanger = mx-in-mdn.apple.com
apple.com MX preference = 20, mail exchanger = mx-in-rno.apple.com
apple.com MX preference = 10, mail exchanger = mx-in.g.apple.com
笔记:
我使用findstr
错误重定向来删除不需要的输出nslookup
答案2
我忘了说了,我只需要一行输出,而不是整个 MX 数据集。存储哪个数据集也无关紧要。此外,如果某个域中出现拼写错误,输出应该存储一条错误消息。我目前的解决方案与 BIND 9 结合使用,如下所示:
@echo off
setlocal enabledelayedexpansion
set "inputFile=domains.txt"
set "outputFile=mx_results.txt"
echo. > %outputFile%
for /f "delims=" %%i in (%inputFile%) do (
set "result=ERROR"
for /f "delims=" %%j in ('dig +short mx %%i') do (
set "result=%%j"
)
echo !result! >> %outputFile%
)