cmd 设置连接及断开网络
最近项目中一个很老的小工具失效了。调查原因发现有可能是因为以前此工具只支持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)的名字可能是英文也可能是中文。