我有 2 條來自不同 ISP 的乙太網路電纜。我想建立一個 CMD (.bat) 腳本,它會找出連接了哪條電纜,然後相應地更改乙太網路設定。
我有更改設定的腳本部分。我該如何識別電纜?
: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
答案1
1) 您對每個 ISP 都有可預測的設置
2) 不需要為每個 ISP 設定使用 2 個標籤
3) 代替find /i ... errorlevel
到findstr && || (operators)
4) 將您的標籤替換為if...() 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
為了讓這對你有用實名/IP,需要對某些線路進行一些調整來處理實名/ipDNS.SER.VER.1 和 DNS.SER.VER.2。
cls & echo/ & 對於 %%i in (1,2 ///> 將1,2替換為真實姓名或IP
)執行“%__APPDIR__%ping.exe”-n 1dns.ser.ver.%%~i ///> 替換為僅在迴圈 dns.ser.ver 中使用變數。%%我
設定“_cmd_netsh=%__APPDIR__%netsh.exe 介面 ipv4” && 如果不是“!_isp_srv!” =="1" ( //> 將「1」替換為 DNS.SER.VER.1 的真實名稱
)||回顯/DNSISP-%%i //> 替換為循環 %%i 中的 var
& 如果「%%~i」=="2" ///> 替換為 DNS.SER.VER.2 的真實名稱
- 相同的代碼在“常規格式”
@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
這個問題表明您想要將實際的電纜設定從當前的 ISP 更改為另一個 ISP ...
因此,您也可以使用更簡單的程式碼來完成此操作,例如: 是的,也許事情沒那麼簡單。
@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
抱歉我水平有限英語
答案2
以下是 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
請用真實的 DNS 伺服器 IP 位址取代 DNS.SER.VER.1 和 DNS.SER.VER.2
如果第一個 ping 沒有找到 ISP-1 DNS 伺服器,FIND 會拋出錯誤等級 1
。
CHANGE-ISP -1
如果 ping ISP-1 DNS 伺服器失敗,則腳本執行 ping DNS.SER.VER.2 | find /I "TTL"
如果找到 ISP-2,則 Errorlevel 為 0,並且您會看到 DNS SERVER ISP-2 UP,
然後腳本會將您轉至 CHANGE-ISP-2
如果此時您尚未重新導向至 CHANGE-ISP-1 或 CHANGE-ISP-2,您會看到兩個 ISP 連線都失敗,並且可以向管理員執行您想要的任何警告。