所以我必须使用仅批量。基本上,服务器HOSTNAMES都列在txt文件中。我使用以下代码ping所有服务器并在txtfile中显示其结果。
For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt
以上针对所有服务器。现在,我想在一个单独的文件中输出IP地址和主机名。我怎样才能做到这一点? 我知道我可以运行for循环搜索“TTL”之类的单词,然后查找第三个标记(对于IP)和第二个标记(HOSTNAME)的“PINGING”等单词。但我有错误,无法正确显示它。我想在不同的文件中输出IP和主机名的原因是为了列出DOWN和UP服务器。
帮助将不胜感激。 :)
编辑:就这样它不会让人困惑,想让你们知道有3个不同的文件,testservers.txt里面有HOSTNAMES,pingtest.txt有ping结果,而result.txt会有IP主机名的当前状态为DOWN或UP。答案 0 :(得分:19)
嗯,很不幸的是你也没有发布自己的代码,因此可以纠正。
无论如何,这是我自己的解决方案:
@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地址解析的两种可能情况:
如果无法解析主机IP地址,则地址设置为“ADDRESS N / A”。
希望这有帮助。
答案 1 :(得分:4)
解析每个HOST名称和批处理结果的pingtest.txt很困难,因为名称和结果在不同的行上。
直接测试每个PING命令的结果(返回的错误代码)而不是重定向到文件要容易得多。将整个构造包含在parens中并将最终输出重定向一次也更有效。
>result.txt (
for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
答案 2 :(得分:0)
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%
答案 3 :(得分:0)
试试这个
$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
答案 4 :(得分:0)
我研究了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%
)
答案 5 :(得分:0)
@echo off
设置workdir = {你的工作目录。例如 - C:\ work} set 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%
)
答案 6 :(得分:0)
这很好用我只需添加-a选项来ping解决问题 主机名。谢谢https://stackoverflow.com/users/4447323/wombat
@echo off setlocal enabledelayedexpansion 设置OUTPUT_FILE = result.csv
getInstallerPackageName()
答案 7 :(得分:0)
这适用于西班牙语操作系统。
脚本接受两个参数:
script.bat listofurls.txt output.txt
@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!
)