cmd 设置连接及断开网络

fly12340 / 2024-10-21 / 原文

最近项目中一个很老的小工具失效了。调查原因发现有可能是因为以前此工具只支持enable/disable一个网络适配器(网络连接)。但是现在新人的机器里又有无线网络的又有虚拟机的网络适配器,此工具不支持其他涉及专属网络连接名字的属性。而且此工具是个.exe应该是前辈自己开发的,然而又无法找到源码。

既然无法改变那就重新来过,自己搞一个好了。网络连接既然是windows的功能,想必网上会有很多cmd支持的方式去关闭和打开。说干就干。在某AI工具的加持下,迅速搞了一个cmd版。As we know “Talk is cheap, show me the code”

三个阶段: 原始版,进阶版,工程版

原始版  

1 @echo off
2 for /f "tokens=*" %%a in ('netsh interface show interface ^| find "已断开"') do (
3     netsh interface set interface "%%a" admin=enable
4 )

这里的核心是 netsh interface set interface "%%a" admin=enable,打开名字为%%a的网络适配器。

另一个netsh interface show interface 是检索当前有哪些网络适配器,加一个 | find "已断开" 是用来紧接着在返回结果中进行检索只要带有“已断开”字样,就意味着是需要打开的适配器。

 

进阶版

需求-因为是remote到另外一个物理机调试的。我不希望在断网的时候把自己也断了,所以需要能避开特殊连接的适配器。

 1 @echo off
 2 setlocal enabledelayedexpansion
 3 
 4 rem 设定要跳过的适配器名称关键字
 5 set "skipKeyword=特殊名称"
 6 
 7 rem 获取所有网络适配器
 8 for /f "tokens=*" %%a in ('netsh interface show interface ^| find "Connected"') do (
 9 set "interfaceName=%%a"
10 rem 检查适配器名称是否包含关键字
11 echo !interfaceName! | find /i "%skipKeyword%" >nul
12 if errorlevel 1 (
13 rem 如果不包含关键字,则禁用适配器
14 netsh interface set interface "!interfaceName!" admin=disable
15 ) else (
16 echo 跳过适配器: !interfaceName!
17 )
18 )
19 endlocal

使用了一个技巧 echo !interfaceName! ^| find /i "%skipKeyword%" >nul , 这里使用^| find检索特定的关键词,如果检索不到会返回errorlevel=1,而且使用了>nul 意思是不想要其他的输出内容

工程版

实际使用过程中发现for 循环中只用一个变量%%a获取返回值,那么返回的内容实际上是一行的字符串,而里面却包含了 状态,类型,名称等信息。然而只有名字是真正需要的。

 1 @echo off
 2 setlocal enabledelayedexpansion
 3 
 4 rem 设定要禁用的适配器名称
 5 set "targetAdapter=VMWare network adapter"
 6 
 7 rem 获取所有网络适配器
 8 for /f "tokens=1,2,3,* delims= " %%a in ('netsh interface show interface ^| findstr /r /c:"已连接"') do (
 9     set "status=%%a"
10     set "state=%%b"
11     set "type=%%c"
12     set "interfaceName=%%d"
13     rem 启用延迟变量扩展
14     setlocal enabledelayedexpansion
15     rem 检查适配器名称是否匹配
16     if /i "!interfaceName!"=="%targetAdapter%" (
17         echo 已禁用适配器: !interfaceName!
18         netsh interface set interface name="!interfaceName!" admin=disable
19     )
20     endlocal
21 )
22 endlocal

 使用了多个变量获取循环返回值对应各个字段。这样就可以获取真正的名字信息了。

9 set "status=%%a"
10 set "state=%%b"
11 set "type=%%c"
12 set "interfaceName=%%d"

 

基本功能已经实现后面要做的就是增加入参扩展适用面,把名字和状态信息做成调用是可控。这样一个enable/disable 网络连接的功能就做好了。

提示:网络适配器(network adopter)的名字可能是英文也可能是中文。