【问题标题】:Get hostnames from ping and store results to text从 ping 获取主机名并将结果存储到文本
【发布时间】:2026-02-14 19:40:01
【问题描述】:

好的,情况就是这样。我有一个非常大的文本文件,其中包含许多不同的 IP 地址。我想创建一个批处理文件或任何可以完成工作的文件,以便解析这些 IP 地址的所有主机名。

目前,我在名为addresses.txt的文件中每行存储一个IP地址。

我还有一个包含以下代码的批处理文件:

@echo off
for /f "delims=" %%a in (addresses.txt) do ping -a %%a >> PING_LOG.txt && (echo %%a Passed) || (echo %%a Failed)
pause

这似乎工作正常。它用 ping 的所有结果填充我的文本文件;主机名、回复、统计信息、数据包等。

问题出在:希望将我 ping 的地址和主机名写入我的输出文件。有什么办法可以做到这一点吗?通过批处理命令?通过其他方式(例如获取输出文件并通过其他方式运行它以获取信息)?我仍在积极尝试看看我能弄清楚什么,但任何帮助都将不胜感激。

(最终目标是将主机名和地址并排放置在 Excel 电子表格中,考虑到实际上有成千上万的人手动操作听起来很糟糕)

我的最终解决方案

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%A in (addresses.txt) do (
    set "_res=%%A"
    for /f "tokens=2" %%B in ('^(nslookup %%A ^) ^| findstr /c:"Name:"') do set "_res=!_res!, %%B"
    echo !_res! >> LOG.txt
    echo !_res!
)
endlocal

感谢 Dmitry 和 Gravity 的帮助 ^

接下来,我将数据放入电子表格(只有一列)。我编写了一个查看每个单元格的宏脚本,使用逗号作为分隔符将数据拆分为字符串数组,然后将每个生成的字符串并排放入一列(ip | name)。

【问题讨论】:

  • Ping IP 地址不会(通常)为您返回该 IP 地址的主机名。听起来有点像nslookup 功能是你需要的.. 但你说 "... 用所有结果填充我的文件... hostname..." 有些环境中有些人会在ping 结果中看到主机名,但我不建议在这里使用它。
  • @gravity: ping -a 通常会这样做。
  • @gravity -a 得到了我需要的信息,但你是对的,nslookup 更好。我完全忘记了这一点。我将尝试使用 nslookup 重写 Dmitry 的解决方案,我将发布我能想到的任何内容。
  • @Stephan - 不幸的是,不在我的盒子上,所以它依赖于环境,因此检索主机名不可靠。 “通常”不是一个好的依赖项。
  • @gravity 我正在 ping 的所有地址都是本地化的,因此它似乎可以始终如一地工作。它只是比 nslookup 慢得多。但是,到目前为止,我不知道如何像使用 ping 一样从中获取结果。

标签: windows batch-file cmd ping


【解决方案1】:

ping ... 命令传递给findstr,然后在第二个for 循环中解析输出:

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%A in (addresses.txt) do (
    set "_res=%%A"
    for /f "tokens=2" %%B in ('^(ping -a %%A ^&^& echo --- ok^|^| echo --- failed^) ^| findstr /c:" [" /c:"---"') do set "_res=!_res!, %%B"
    echo !_res!
)
endlocal

对于addresses.txt

8.8.8.8
88.88.77.77

会产生

8.8.8.8, google-public-dns-a.google.com, ok
88.88.77.77, ti0150a400-1603.bb.online.no, failed

【讨论】:

  • 近乎完美的解决方案。我需要输出到一个文本文件,所以我做了这个更改:echo !_res! >> LOG.txt,它似乎正在工作。唯一的问题是,现在我无法在命令窗口中跟踪进度。有什么方法可以同时输出到命令窗口和文本文件?
  • 只需在第一个 echo 之后添加另一个 echo !_res!
  • 那行得通。再问你一个问题。我正在尝试使用 nslookup。据我所知,令牌仅指第一行,而且我似乎无法从 nslookup 中获取任何响应信息(或者 ping -a 超过 8 的任何响应信息)。这究竟是如何工作的? (nslookup 的响应速度更快,考虑到有数千个,我认为它会更好)
  • for /f "tokens=2" %%i in ('nslookup 8.8.8.8 2^>nul^|find "Name:"') do @echo %%i (也许您必须使Name: 适应您的语言环境。)
  • for 解析命令或文件的每一行。要选择要解析的行,请使用findstr