どのイーサネットケーブルが接続されたかを識別する

どのイーサネットケーブルが接続されたかを識別する

別々の ISP から 2 本のイーサネット ケーブルが来ています。どのケーブルが接続されているかを検出し、それに応じてイーサネット設定を変更する 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 ... errorlevelfindstr && || (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実名/IPを扱うためにいくつかの行にいくつかの調整が必要ですDNS.SER.VER.1 および DNS.SER.VER.2。


cls & echo/ & %%i の (1,2 //> 1,2を実名またはIPに置き換えます
)「%__APPDIR__%ping.exe」-n 1を実行しますdns.ser.ver.%%~i //> ループ内の変数のみを使用するように置き換えますdns.ser.ver. %%i 
"_cmd_netsh=%__APPDIR__%netsh.exe interface ipv4" を設定します && そうでない場合は "!_isp_srv!" =="1" ( //> "1" を DNS.SER.VER.1 の実際の名前に置き換えます
)|| エコー/ DNSISP-%%i //> ループ内の変数 %%i に置き換えます
& if "%%~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.SER.VER.1 と DNS.SER.VER.2 を実際の DNS サーバー IP アドレスに置き換えてください。

最初の ping で ISP-1 DNS サーバーが見つからない場合、FIND はエラーレベル 1 を起動します。
見つかった場合、エラーレベルは 0 なので、echo 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 接続が失敗しました」と表示され、システム管理者に任意の警告を実行できます。

関連情報