Tenho 2 cabos Ethernet provenientes de ISPs separados. Quero criar um script CMD (.bat) que descubra qual cabo está conectado e, em seguida, altere as configurações de Ethernet de acordo.
Eu tenho a parte do script que altera as configurações. Como posso identificar o cabo?
:CHANGE-ISP-1
netsh interface ipv4 set address name="Ethernet 2" static 108.129.156.199 255.255.255.0 108.129.156.1 store=persistent
netsh interface ipv4 set dnsservers name="Ethernet 2" source=static address="108.129.159.31" validate=no
netsh interface ipv4 add dnsservers name="Ethernet 2" address="108.129.159.33" validate=no index=2
:CHANGE-ISP-2
netsh interface ipv4 set address name="Ethernet 2" source=dhcp
netsh interface ipv4 set dnsservers name="Ethernet 2" source=dhcp
Responder1
1) Você tem configurações previsíveis para cada ISP
2) Não é necessário usar 2 rótulos para cada configuração de ISP
3) Substituirfind /i ... errorlevel
parafindstr && || (operators)
4) Substitua suas etiquetas porif...() else ()...
@echo off && setlocal enabledelayedexpansion
cls & echo/ & for %%i in (1,2
)do "%__APPDIR__%ping.exe" -n 1 dns.ser.ver.%%~i|%__APPDIR__%findstr.exe "TTL=" >nul && (
echo/ DNS ISP-%%~i ping/link status: UP^^!! && set "_isp_srv=%%~i" && goto :_change-isp_:
)|| echo/ DNS ISP-%%i ping/link status: DOWN^^!! & if "%%~i" == "2" endlocal && goto :EOF
:_change-isp_:
set "_cmd_netsh=%__APPDIR__%netsh.exe interface ipv4" && if not "!_isp_srv!" == "1" (
!_cmd_netsh! set address name="Ethernet 2" source=dhcp && !_cmd_netsh! set dnsservers name="Ethernet 2" source=dhcp
) else (!_cmd_netsh! set address name="Ethernet 2" static 108.129.156.199 255.255.255.0 108.129.156.1 store=persistent
!_cmd_netsh! set dnsservers name="Ethernet 2" source=static address="108.129.159.31" validate=no
!_cmd_netsh! add dnsservers name="Ethernet 2" address="108.129.159.33" validate=no index=2 )
rem./ do more tasks here, after that add "endlocal" at the end: ===^> && endlocal && goto :EOF
Para que isso funcione para você comnome real/IP, alguns ajustes em algumas linhas são necessários para lidar com nomes/ip reais paraDNS.SER.VER.1 e DNS.SER.VER.2.
cls & echo/& para %%i em (1,2 //> substitua 1,2 pelo nome real ou IP
)faça "%__APPDIR__%ping.exe" -n 1dns.ser.ver.%%~i //> substitua por usar apenas a variável no loopdns.ser.ver.%%eu
defina "_cmd_netsh=%__APPDIR__%netsh.exe interface ipv4" && se não "!_isp_srv!" =="1" ( //> substitua "1" pelo nome real de DNS.SER.VER.1
)|| eco/DNSISP-%%i //> substitua pela var no loop %%i
& se "%%~i" =="2" //> substitua pelo nome real de DNS.SER.VER.2
- O mesmo código em"formatação convencional"
@echo off && setlocal enabledelayedexpansion
cls
echo/
for %%i in (1,2) do (
"%__APPDIR__%ping.exe" -n 1 dns.ser.ver.%%~i|%__APPDIR__%findstr.exe "TTL=" >nul && (
echo/ DNS ISP-%%~i ping/link status: UP^^!!
set "_isp_srv=%%~i"
goto :_change-isp_:
) || (
echo/ DNS ISP-%%i ping/link status: DOWN^^!!
if "%%~i" == "2" endlocal && goto :EOF
)
)
:_change-isp_:
set "_cmd_netsh=%__APPDIR__%netsh.exe interface ipv4"
if not "!_isp_srv!" == "1" (
!_cmd_netsh! set address name="Ethernet 2" source=dhcp
!_cmd_netsh! set dnsservers name="Ethernet 2" source=dhcp
) else (
!_cmd_netsh! set address name="Ethernet 2" static 108.129.156.199
255.255.255.0 108.129.156.1 store=persistent
!_cmd_netsh! set dnsservers name="Ethernet 2" source=static
address="108.129.159.31" validate=no
!_cmd_netsh! add dnsservers name="Ethernet 2" address="108.129.159.33" validate=no index=2
)
rem./ do more tasks here, after that add "endlocal" at the end: ===^> && endlocal && goto :EOF
Esta pergunta sugere que você deseja alterar as configurações reais do cabo do atual para outro ISP...
Então, você também pode fazer isso com um código mais simples, tipo: sim, talvez não seja tão simples assim.
@echo off && setlocal enabledelayedexpansion && cls & echo/
pushd %__APPDIR__% & set "_cmd_netsh=netsh.exe interface ipv4" && ping.exe -n 1 108.129.156.1|findstr "TTL=">nul && (
!_cmd_netsh! set address name="Ethernet 2" source=dhcp && !_cmd_netsh! set dnsservers name="Ethernet 2" source=dhcp
)||( !_cmd_netsh! set address name="Ethernet 2" static 108.129.156.199 255.255.255.0 108.129.156.1 store=persistent
!_cmd_netsh! set dnsservers name="Ethernet 2" source=static address="108.129.159.31" validate=no
!_cmd_netsh! add dnsservers name="Ethernet 2" address="108.129.159.33" validate=no index=2 )
podp & endlocal && goto :EOF
Desculpe meu limitadoInglês
Responder2
Aqui está um pseudocódigo para ilustrar como verificar, trazido a você por Crude Hacks 'R Us:
ping DNS.SER.VER.1 | find /I "TTL"
if not errorlevel 1 echo DNS ISP-1 UP
if not errorlevel 1 GOTO CHANGE-ISP-1
ping DNS.SER.VER.2 | find /I "TTL"
if not errorlevel 1 echo DNS ISP-2 UP
if not errorlevel 1 GOTO CHANGE-ISP-2
echo BOTH ISP CONNECTIONS FAIL
Substitua os endereços IP reais do servidor DNS por DNS.SER.VER.1 e DNS.SER.VER.2
Se o primeiro ping não encontrar o servidor DNS ISP-1, FIND inicia um Errorlevel 1.
Se encontrar, Errorlevel é 0, então você obtém um echo DNS SERVER ISP-1 UP
e o script leva você para CHANGE-ISP -1
Se o ping para o servidor DNS ISP-1 falhar, o script executará o ping DNS.SER.VER.2 | find /I "TTL"
Se encontrar ISP-2, então Errorlevel é 0 e você vê DNS SERVER ISP-2 UP,
então o script leva você para CHANGE-ISP-2
Se neste ponto você não tiver sido redirecionado para CHANGE-ISP-1 ou CHANGE-ISP-2, você verá AMBAS AS CONEXÕES DO ISP FALHARAM e poderá executar qualquer aviso ao sysop que desejar.