我有 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 在 (1,2 //> 将1,2替换为真实姓名或IP
)执行“%__APPDIR__%ping.exe”-n 1dns.ser.ver.%%~i //> 替换循环中仅使用变量的dns.ser.ver.%%i
设置“_cmd_netsh=%__APPDIR__%netsh.exe 接口 ipv4”&&如果不是“!_isp_srv!”==“1”(//> 将“1”替换为DNS.SER.VER.1的真实名称
)|| 回显/ DNSISP-%%i //> 替换为循环中的变量 %%i
& 如果 "%%~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。
如果找到了,错误级别为 0,因此您将收到回显 DNS SERVER ISP-1 UP,
然后脚本将您转到 CHANGE-ISP-1
如果对 ISP-1 DNS 服务器的 ping 操作失败,则脚本将执行 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 连接都失败,并且可以对系统操作员执行您希望的任何警告。