2017-02-24 2 views
0

Ich muss eine Reihe von IPs (DNS) überprüfen, um zu sehen, ob sie online sind, und sortieren sie nur in die Arbeit.Windows Batch - Überprüfen Sie, ob eine Reihe von IPs online sind und sortieren Sie sie in die Online

Beispiel:

Eingang: 8.8.8.8 8.8.4.4 1.1.1.1 32.45.76.54 208.67.222.222

Ausgang: 8.8.8.8 8.8.4.4 208.67.222.222

Hier ist, was ich bisher habe:

set dns=8.8.8.8 8.8.4.4 1.1.1.1 32.45.76.54 208.67.222.222 
set olddns=%dns% 
set lastdns=0 
set dnsnumber=1 

:startdns 
for /f "tokens=%dnsnumber%" %%i in ("%dns%") do set pickeddns=%%i 
call:checkip %pickeddns% 
if /i "%dnsstatus%"=="up" set /a dnsnumber=%dnsnumber%+1 
if /i "%dnsstatus%"=="down" (for /f "tokens=1,*" %%a in ("%dns%") do set dns=%%b) 
if /i "%lastdns%"=="%pickeddns%" goto :AddDNS 
set lastdns=%pickeddns% 
goto :startdns 

:AddDNS 
echo %dns% 
pause 

:checkip 
cls 
set ip=%~1 
ping -n 1 -w 2000 %ip% | find "TTL" 
if not errorlevel 1 set dnsstatus=up 
if errorlevel 1 set dnsstatus=down 
cls 
goto :eof 

Ich denke, das Problem in der

if /i "%dnsstatus%"=="down" (for /f "tokens=1,*" %%a in ("%dns%") do set dns=%%b) 
ist

, weil ich möchte, dass es das nicht funktionierende DNS entfernt, aber stattdessen entfernt es das erste DNS in der Liste. Hat jemand eine Lösung für dieses Problem?

+0

Ugh. Dies kann um ein Vielfaches verkürzt werden. Sie verwenden den falschen FOR-Befehl, der dazu führt, dass Sie zu viel zusätzlichen Code verwenden. Um Ihren Code wirklich zu reparieren, würden Sie nur eine String-Ersetzung durchführen, indem Sie die IP-Adresse aus der DNS-Variablen entfernen. Beispiel: 'set DNS =! DNS: %% b =!'. Dazu müssten Sie auch die verzögerte Erweiterung aktivieren. Ungeachtet dessen werde ich eine viel verkürzte Version Ihrer Logik veröffentlichen. – Squashman

Antwort

1

Dies sollte für Sie arbeiten. Beim Entfernen von der Haupt-DNS-Variablen bleibt jedoch zusätzlicher Speicherplatz übrig.

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
set dns=8.8.8.8 8.8.4.4 1.1.1.1 32.45.76.54 208.67.222.222 
set olddns=%dns% 

:startdns 
for %%G in (%olddns%) do (
    ping -n 1 -w 2000 %%G | find "TTL" >nul 2>&1 
    if errorlevel 1 set "dns=!dns:%%G=!" 
) 
echo %dns% 
pause 

goto :eof 
+0

Frage nur, ist es möglich, die DNS ohne die zusätzlichen Leerzeichen zu bekommen? Ich würde jeden DNS pingen und herausfinden, welche zwei DNS den niedrigsten Ping hatten, und sie dann mit netsh-Befehlen hinzufügen. Ist das überhaupt möglich? – djmrminer

+0

@djmrminer sollte der zusätzliche Speicherplatz keine Probleme damit verursachen. – Squashman

+1

Der Befehl 'ping' kann [Fehler] (https://technet.microsoft.com/en-us/library/cc952252.aspx) anzeigen, die die Zeichenfolge' TTL' enthalten. Es ist sicherer, 'TTL =' zu verwenden –

Verwandte Themen