batch file - lista - ¿Cómo hacer ping a varios servidores y devolver la dirección IP y los nombres de host usando el script por lotes?
descargar ping gui (7)
El análisis pingtest.txt para cada nombre HOST y resultado con lote es difícil porque el nombre y el resultado se encuentran en líneas diferentes.
Es mucho más fácil probar el resultado (el código de error devuelto) de cada comando PING directamente en lugar de redirigir a un archivo. También es más eficiente encerrar todo el constructo en parens y redirigir el resultado final solo una vez.
>result.txt (
for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
Así que tengo que usar lotes solo para esto. Básicamente, los HOSTNAMES del servidor están listados en un archivo txt. Usé el siguiente código para hacer ping a todos los servidores y mostrar sus resultados en un archivo txt.
For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt
Lo anterior conectó con todos los servidores. Ahora, quiero dar salida a las direcciones IP y los nombres HOST en un archivo separado. ¿Cómo puedo hacer esto? Sé que puedo ejecutar un bucle for buscando palabras como "TTL" y luego buscar el 3er token (para el IP) y palabras como "PINGING" para el segundo token (HOSTNAME). Pero estoy teniendo errores y no puedo mostrarlos correctamente. La razón por la que deseo exportar direcciones IP y nombres de host en un archivo diferente es hacer una lista de los servidores DOWN y UP.
La ayuda será apreciada. :)
EDITAR: para que no sea confuso, quería dejarles saber que hay 3 archivos diferentes, testservers.txt tiene los HOSTNAMES, pingtest.txt tiene resultados de ping, y result.txt tendrá las direcciones IP junto con los nombres de host con su estado actual como DOWN o UP.
El problema con el ping es que si el host no está vivo, a menudo su máquina local responderá que el host con pin no está disponible, por lo que el código de error de ping será 0 y su código se ejecutará con error porque no reconoce el estado inactivo.
mejor hazlo de esta manera
ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)
de esta manera se busca una ttl de cadena típica que siempre está en el resultado de ping bien hecho y el error de verificación en este findtr en lugar de ping irritante
En general, esto se ve así:
@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%
Prueba esto
$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
Trabajé en el código proporcionado anteriormente por Eitan-T y volví a trabajar para generar un archivo CSV. Encontré que los resultados en el código anterior no siempre daban los valores correctos así que lo he mejorado.
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%
)
Bueno, es lamentable que no publicaras tu propio código también, para que pueda ser corregido.
De todos modos, aquí está mi propia solución a esto:
@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%
)
El bucle externo itera a través de los hosts y el bucle interno analiza la salida de ping
. Las dos primeras sentencias if
manejan los dos posibles casos de resolución de la dirección IP:
- El nombre de host es la dirección IP del host.
- La dirección IP del host se puede resolver a partir de su nombre.
Si la dirección IP del host no se puede resolver, la dirección se establece en "DIRECCIÓN N / A".
Espero que esto ayude.
@echo off
set workdir = {su directorio de trabajo. por ejemplo, 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%
)
Esto funcionó muy bien, solo agregué la opción -a para hacer ping para resolver el nombre de host. Gracias https://.com/users/4447323/wombat
@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 -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%
)