Batch file 如何使用批处理脚本ping多个服务器并返回IP地址和主机名?
因此,我只能使用批处理。基本上,服务器主机名都列在一个txt文件中。我使用以下代码ping所有服务器,并在txtfile中显示它们的结果Batch file 如何使用批处理脚本ping多个服务器并返回IP地址和主机名?,batch-file,ping,Batch File,Ping,因此,我只能使用批处理。基本上,服务器主机名都列在一个txt文件中。我使用以下代码ping所有服务器,并在txtfile中显示它们的结果 For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt 上面的命令ping了所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我该怎么做? 我知道我可以运行for循环来搜索诸如“TTL”之类的词,然后查找第三个令牌(对于IP)和诸如“ping”之类的词来查找第二个
For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt
上面的命令ping了所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我该怎么做?
我知道我可以运行for循环来搜索诸如“TTL”之类的词,然后查找第三个令牌(对于IP)和诸如“ping”之类的词来查找第二个令牌(主机名)。但我有错误,无法正确显示。我之所以想在不同的文件中输出IP和主机名,是为了列出停机和停机的服务器
如蒙帮助,将不胜感激。:)
编辑:为了避免混淆,想让你们知道有3个不同的文件,testservers.txt有主机名,pingtest.txt有ping结果,和result.txt将具有IP以及主机名,其当前状态为DOWN或UP。很难通过批处理解析每个主机名和结果的pingtest.txt,因为名称和结果位于不同的行中 直接测试每个PING命令的结果(返回的错误代码)比重定向到文件要容易得多。将整个构造包含在parens中并重定向最终输出一次也更有效
>result.txt (
for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
不幸的是,您没有发布自己的代码,以便更正。
无论如何,我有自己的解决方案:
@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=result.txt
>nul copy nul %OUTPUT_FILE%
for /f %%i in (testservers.txt) do (
set SERVER_ADDRESS=ADDRESS N/A
for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
if %%x==Pinging set SERVER_ADDRESS=%%y
if %%x==Reply set SERVER_ADDRESS=%%z
if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
)
echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
)
外部循环遍历主机,内部循环解析ping
输出。前两个if
语句处理两种可能的IP地址解析情况:
希望这有帮助。ping的问题是,如果主机不活动,您的本地计算机通常会返回ping主机不可用的答案,因此ping的错误代码将为0,并且您的代码将错误运行,因为无法识别关闭状态 最好这样做
ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)
通过这种方式,您可以查找一个典型的字符串ttl,它总是在良好的ping结果中,并检查这个findstr上的错误,而不是恼人的ping
总的来说,这看起来是这样的:
@echo off
SetLocal
set log=path/to/logfile.txt
set check=path/to/checkfile.txt
:start
echo. some echo date >>%log%
:check
for /f %%r in (%check%) do (call :ping %%r)
goto :eof
:ping
ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)
:error
echo. some errormessage to >>%log%
echo. some blat to mail?
:eof
echo. some good message to >>%log%
试试这个
$servers = Get-Content test.txt
$reg=""
foreach ($server in $servers)
{
$reg=$reg+$server+"`t"+([System.Net.Dns]::GetHostAddresses($server) | foreach {echo $_.IPAddressToString})+"`n"
}
$reg >reg.csv
我编写了Eitan-T之前给出的代码,并重新编写以输出到CSV文件。发现早期代码中的结果并不总是给出正确的值,所以我对其进行了改进 testservers.txt
SOMESERVER
DUDSERVER
results.csv
HOSTNAME LONGNAME IPADDRESS STATE
SOMESERVER SOMESERVER.DOMAIN.SUF 10.1.1.1 UP
DUDSERVER UNRESOLVED UNRESOLVED DOWN
pingtest.bat
@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=result.csv
>nul copy nul %OUTPUT_FILE%
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
for /f %%i in (testservers.txt) do (
set SERVER_ADDRESS_I=UNRESOLVED
set SERVER_ADDRESS_L=UNRESOLVED
for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
if %%x==Pinging set SERVER_ADDRESS_L=%%y
if %%x==Pinging set SERVER_ADDRESS_I=%%z
if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
)
echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
)
@回音
设置workdir={您的工作目录。例如-C:\work}
设置iplist=%workdir%\IP-list.txt
setlocal enabledelayedexpansion
set OUTPUT_FILE=%workdir%\result.csv
>nul copy nul %OUTPUT_FILE%
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
for /f %%i in (%iplist%) do (
set SERVER_ADDRESS_I=UNRESOLVED
set SERVER_ADDRESS_L=UNRESOLVED
for /f "tokens=1,2,3" %%x in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') do (
if %%x==Pinging set SERVER_ADDRESS_L=%%y
if %%x==Pinging set SERVER_ADDRESS_I=%%z
if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
)
echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
)
这非常有效,我只是在ping中添加了-a选项来解决这个问题 主机名。谢谢 @回音 延迟扩展 设置输出文件=result.csv
>nul copy nul %OUTPUT_FILE%
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
for /f %%i in (testservers.txt) do (
set SERVER_ADDRESS_I=UNRESOLVED
set SERVER_ADDRESS_L=UNRESOLVED
for /f "tokens=1,2,3" %%x in ('ping -n 1 -a %%i ^&^& echo SERVER_IS_UP') do (
if %%x==Pinging set SERVER_ADDRESS_L=%%y
if %%x==Pinging set SERVER_ADDRESS_I=%%z
if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
)
echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
)
这适用于西班牙语操作系统 脚本接受两个参数:
- 包含IP或域列表的文件
- 输出文件
这应该有助于整洁,但这不会提取IP地址,这需要解析ping而不是将其重定向到
nul
+无论如何,+1-我喜欢它。代码依赖于语言。除英语外,它还必须更改。你认为有法语/德语/荷兰语版本的ping
?绝对有!有德语、葡萄牙语、法语和波兰语的样本输出。非常感谢。很抱歉,我不能发布我的代码,因为它有一些属于该公司的东西。不能到处张贴。但尽管如此,我所做的只是有两个单独的for循环来提取IP和主机名,但我无法进行“向上”和“向下”检查,因为它是两个不同的for循环。@EitanT,它是否处理来自192.168.2.1的回复:无法访问目标主机。
?您的脚本在bash中。问题是关于批处理的。@EitanT,这不是Bash,这是Powershell。@Suncatcher我纠正了。尽管如此,问题的要求只是批量的……请解释你的答案是如何解决问题的,它将帮助每个人更清楚地理解你的解决方案,并供将来参考。
@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=%2
>nul copy nul %OUTPUT_FILE%
for /f %%i in (%1) do (
set SERVER_ADDRESS=No se pudo resolver el host
for /f "tokens=1,2,3,4,5" %%v in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP')
do (
if %%v==Haciendo set SERVER_ADDRESS=%%z
if %%v==Respuesta set SERVER_ADDRESS=%%x
if %%v==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
)
echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE!
)