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?
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