Je dois donc utiliser batch uniquement pour cela. Fondamentalement, les noms de hôte du serveur sont tous répertoriés dans un fichier txt. J'ai utilisé le code suivant pour cingler tous les serveurs et afficher leurs résultats dans un fichier txt.
For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt
Ce qui précède a envoyé une requête ping à tous les serveurs. Maintenant, je veux sortir les adresses IP et les noms d’hôtes dans un fichier séparé. Comment puis-je faire cela? Je sais que je peux exécuter une boucle for en recherchant des mots tels que "TTL", puis le 3ème jeton (pour l'IP) et des mots tels que "PINGING" pour le deuxième jeton (HOSTNAME). . Mais j'ai des erreurs et je ne peux pas l'afficher correctement. La raison pour laquelle je veux exporter les adresses IP et les noms d’hôte dans un fichier différent est de dresser une liste des serveurs DOWN et UP.
L'aide sera appréciée. :)
EDIT: Pour que ce ne soit pas déroutant, je voulais vous faire savoir qu'il y a 3 fichiers différents, testservers.txt contient les HOSTNAMES, pingtest.txt a des résultats de ping, et result.txt aura les IP ainsi que les noms d'hôte avec leur statut actuel en tant que DOWN ou UP.
Eh bien, il est regrettable que vous n’ayez pas posté votre propre code également, afin qu’il puisse être corrigé.
Quoi qu'il en soit, voici ma propre solution à ceci:
@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%
)
La boucle externe parcourt les hôtes et la boucle interne analyse la sortie ping
. Les deux premières instructions if
traitent les deux cas possibles de résolution d'adresse IP:
Si l'adresse IP de l'hôte ne peut pas être résolue, l'adresse est réglée sur "ADRESSE N/A".
J'espère que cela t'aides.
Il est difficile d'analyser pingtest.txt pour chaque nom d'hôte et résultat avec batch, car le nom et le résultat figurent sur des lignes différentes.
Il est beaucoup plus facile de tester directement le résultat (le code d'erreur renvoyé) de chaque commande PING au lieu de le rediriger vers un fichier. Il est également plus efficace de placer la construction entière entre parenthèses et de rediriger la sortie finale une seule fois.
>result.txt (
for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
Essaye ça
$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
Cela a très bien fonctionné. Je viens d’ajouter l’option -a à ping pour résoudre le nom de domaine. Merci https://stackoverflow.com/users/4447323/wombat
@Écho 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%
)
J'ai travaillé sur le code donné plus tôt par Eitan-T et retravaillé pour sortir en fichier CSV. Les résultats trouvés dans le code précédent ne donnaient pas toujours les valeurs correctes, je l’ai donc amélioré.
testservers.txt
SOMESERVER
DUDSERVER
résultats.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%
)
@Écho off
set workdir = {votre répertoire de travail par exemple - 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%
)
le problème avec ping est que si l'hôte n'est pas actif, votre ordinateur local répondra souvent que l'hôte cinglé n'est pas disponible. Le code d'erreur de ping sera donc 0 et votre code s'exécutera par erreur car il ne reconnaît pas l'état hors tension.
mieux le faire de cette façon
ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)
de cette façon, vous cherchez une chaîne typique ttl qui est toujours dans le résultat de ping bien fait et vérifiez l'erreur sur ce findstr au lieu d'irriter le ping
globalement cela ressemble à ceci:
@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%
Cela fonctionne pour le système d'exploitation espagnol.
Le script accepte deux paramètres:
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!
)