Windowsのイーサネットのオンオフを切り替えるバッチファイルとPowerShell

11/10/2022

Batch Windows

t f B! P L
LANケーブル

Windowsでの作業中にインターネット接続のオンオフを切り替えたいと思うことが多々あるのですが、最近、PCのインターネット接続を無線から有線に変えたため、タスクバーからオンオフを変更できなくなったので、イーサネットを切り替えるバッチファイル+PowerShellを作成しました。

イーサネットのオンオフを切り替えるバッチファイル

結論から書くとこうです。環境に合わせて多少書き換える必要があります。

@echo off
rem イーサネットのONとOFFを切り替え

net session > nul 2>&1 
if not %ERRORLEVEL%==0 (
  powershell start-process \"%~f0\" -WindowStyle Hidden -verb runas > nul
  exit
)

set filePath=%TMP%\networkInterfaceList.txt
set interfaceName=イーサネット

netsh interface show interface > %filePath%

for /f "usebackq delims=" %%A in (`PowerShell -Command "$isnwif = Select-String -Encoding Default -Path %filePath% -Pattern '^有効.*%interfaceName%$';if($isnwif){Write-Output 'True'}else{Write-Output 'False'};"`) do set isnwif=%%A

if "%isnwif%"=="True" (
  netsh interface set interface %interfaceName% disable
) else (
  netsh interface set interface %interfaceName% enable
)

del %filePath%

バッチファイルの説明

まずイーサネットを切り替えるにはnetshコマンドを使用する必要があります。ただし、このコマンドは管理者権限を必要とするので、このバッチファイルを管理者権限で開きなおす必要があります。それを、以下のブロックで行っています。

rem 管理者権限を必要とするコマンド(なんでもいいがレスポンスが早いもの)を実行する
net session > nul 2>&1 
rem 前のコマンドの実行結果を判定
rem 管理者権限を必要とするコマンド実行が成功 == 現在管理者で実行中
if not %ERRORLEVEL%==0 ( 
  rem コマンド実行が失敗したらバックグラウンドでもう一度バッチファイルを開く
  powershell start-process \"%~f0\" -WindowStyle Hidden -verb runas > nul
  exit
)

次に一時的に情報を記録するテキストファイルとインターフェースの名前を定義します。 インターフェースの名前は使用環境によって異なると思いますが、私の場合は"イーサネット"という名前でした。 お手元の環境でnetsh interface show interfaceと入力し、ご確認ください。

set filePath=%TMP%\networkInterfaceList.txt
set interfaceName=イーサネット

PowerShellでファイルからリストを読み込み、指定したものが有効か無効かをTrueかFlaseの文字列で返します。 本来はこの部分もバッチファイルで行うつもりでしたが、コマンドプロンプトのfindstrで長音符"ー"が含まれている際に正規表現が使えないという謎のバグが発生したため、やむなくPowerShellで実装しました。PowerShellは完全ド素人なので最適化できる部分がいろいろとあるかもしれませんがご容赦ください。

for /f "usebackq delims=" %%A in (`PowerShell -Command "$isnwif = Select-String -Encoding Default -Path %filePath% -Pattern '^有効.*%interfaceName%$';if($isnwif){Write-Output 'True'}else{Write-Output 'False'};"`) do set isnwif=%%A

前の実行結果がTrueであればイーサネットを無効に、そうでなければ有効にします。

if "%isnwif%"=="True" (
  netsh interface set interface %interfaceName% disable
) else (
  netsh interface set interface %interfaceName% enable
)

最後に、一時的に作成したファイルを削除します。

del %filePath%

まとめ

久しぶりにバッチファイルを書きましたが、やっぱり難解でだいぶ苦労しました。
改めてPythonのありがたさを感じました... 以上です。