最近在客户现场使用不同的网络,经常要设置IP,每天设置好多次,太麻烦;所以通过“命令行+批处理+环境变量”的方法来更换IP,以节约时间。
bat命令简介
批处理文件,是将命令按一定的顺序集合成一个可执行的文本文件,扩展名为bat或者cmd,统称批处理命令;可在DOS和Windows系统中执行。
以下是一个简单批处理脚本:
@echo off echo "Hello World" pause
02
在开始之前我们应该考虑一下问题,第一如何获取网卡名称(针对在不同操作系统版本中,网卡名称的不同,例如win7为“本地连接”、win10为“Ethernet”以及繁体等等)?第二如何获取管理员权限?第三如何设置固定IP、子网掩码、网关、DNS等?第四如何确认设置是否成功?接下来实现以上问题,最终达到我们想要的结果:
第一、获取网卡名称
常用获取网卡名称的命令多种多样,我们可以采用Getmac命令、wmic nic和wmic nicconfig命令、netsh interface ip命令、nbtstat命令等等,在经过筛选、提取,最终获得我们需要的信息,以下对上述命令简单介绍:
⭐GETMAC命令
该命令返回计算机中所有网卡的媒体访问控制(MAC)地址以及每个地址的网络协议列表,该命令可以从本地返回也可从网络返回。
用法:
GETMAC /S IP[访问地址] /U 用户名 /P 密码
语法参数:
/S Computer :指定远程计算机名或IP,默认本地计算机
/U Domain/User:指定账户权限
/P Password:指定账户密码
/FO{TABLE|LIST|CSV}:指定查询结果输出格式, 有效值为 "TABLE"、"LIST"、"CSV",默认输出格式TABLE
/NH:指定在输出中不显示“列标题”,只对 TABLE 和 CSV 格式有效
/V:指定显示详细输出
/?:提示符显示帮助信息
GETMAC /V /NH /FO CSV #获取网卡名称
输出:
图片
⭐wmic nic和wmic nicconfig命令
wmic是扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持。即wmic是命令行管理工具。WMIC不仅可以管理本地计算机还可以管理同一域内的所有计算机(前提被管理计算机需要支持WMI)。WMIC通过WMIC.exe来分析、解释和执行接收的别名(Alias)的引擎,该文件位于“c:windowssystem32wbem”文件夹中(支持WinXP、Win2003、win7等)。具体详细使用方法参考帮助文档,接下来简单介绍获取已连接的网卡名称时采用的命令:
获取网卡所有信息
wmic nic get wmic nicconfig get
信息筛选
NetEnabled 值为 TRUE 时,网络适配器已启用且已连接
NetEnabled 值为 FALSE 时,网络适配器已禁用或未连接
wmic nic where "NetEnabled='TRUE'" get Index,NetConnectionID
IPEnabled 值为 TRUE 时,网络适配器已连接
IPEnabled 值为 FALSE 时,网络适配器未连接
wmic nicconfig where IPEnabled=“true” get Index, Caption
更改IP
wmic nicconfig where Index=1 call EnableDHCP //动态获取 wmic nicconfig where Index=1 call EnableStatic (“192.168.1.1”), (“255.255.255.0”) //静态IP,设置index=1的网卡
⭐netsh interface ip命令
netsh是一个Windows系统本身提供的网络配置命令
用法:
netsh [-a AliasFile] [-c Context] [-r RemoteMachine] [-u [DomainName]UserName] [-p Password | *] [Command | -f ScriptFile]
语法参数:可通过netsh /? 查看详细介绍
在脚本中采用该命令来配置IP、网关、子网掩码、DNS等
显示配置信息
netsh interface ip show addresses
添加IP、mask、gateway信息
netsh interface ip add address name="Ethernet0" source=static addr=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx gateway=xxx.xxx.xxx.xxx gwmetric=1
修改IP、mask、gateway信息
netsh interface ip set address name="Ethernet0" source=static addr=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx gateway=xxx.xxx.xxx.xxx gwmetric=1
动态获取
netsh interface ip set address name="Ethernet0" source=dhcp
删除IP配置信息
netsh interface ip delete address name="Ethernet0" source=static addr=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx gateway=xxx.xxx.xxx.xxx gwmetric=1
添加DNS
netsh interface ip add dns name="Ethernet0" addr=xxx.xxx.xxx.xxx index=1
修改DNS
netsh interface ip set dns name="Ethernet0" addr=xxx.xxx.xxx.xxx index=1
删除DNS
netsh interface ip delete dns name="Ethernet0" addr=xxx.xxx.xxx.xxx
⭐nbtstat命令
添加DNS
netsh interface ip add dns name="Ethernet0" addr=xxx.xxx.xxx.xxx index=1
修改DNS
netsh interface ip set dns name="Ethernet0" addr=xxx.xxx.xxx.xxx index=1
删除DNS
netsh interface ip delete dns name="Ethernet0" addr=xxx.xxx.xxx.xxx
⭐nbtstat命令
nbtstat是一个用于显示本地计算机和远程计算机的基于TCP/IP(NetBT)协议的NetBIOS统计资料、NetBIOS名称表和NetBIOS名称缓存。
用法:
NBTSTAT [ [-a RemoteName] [-A IP address] [-c] [-n] [-r] [-R] [-RR] [-s] [-S] [interval] ]
语法参数:
-a (适配器状态) 列出指定名称的远程机器的名称表
-A (适配器状态) 列出指定 IP 地址的远程机器的名称表。
-c (缓存) 列出远程计算机名称及其 IP 地址的 NBT 缓存
-n (名称) 列出本地 NetBIOS 名称。
-r (已解析) 列出通过广播和经由 WINS 解析的名称
-R (重新加载) 清除和重新加载远程缓存名称表
-S (会话) 列出具有目标 IP 地址的会话表
-s (会话) 列出将目标 IP 地址转换成计算机 NETBIOS 名称的会话表。
-RR (释放刷新) 将名称释放包发送到 WINS,然后启动刷新
RemoteName 远程主机计算机名。
IP address 用点分隔的十进制表示的 IP 地址。
interval 重新显示选定的统计、每次显示之间暂停的间隔秒数。
按 Ctrl+C 停止重新显示统计。
查看本地NetBIOS名称
nbtstat -n
通过上述获取网卡名称发现,附带很多不需要的信息所以需要我们通过for语句来提取必要的信息,当得到必要的信息时,就可以针对得到的网卡名称设置相应的IP、MASK、GATWAY、DNS等。以下为获取网卡名称的代码:
获取网卡名称
echo 获取网卡名称
设置变量
set n=0
提取第一列的值并赋值
for /f 解析文本;tokens 提取字符串;delims 分割字符串
for /f "tokens=1* delims=," %%a in ('Getmac /v /nh /fo csv') do (
set /a 进行数学运算
set /a m+=1 set "name!m!=%%a" set "name=%name:~1,-1%" )
判断给那个网卡设置
:Select_Card
echo. & echo 1:!name1! & echo 2:!name2! & echo 3:!name3! & echo 4:!name4! & echo 5:!name5! & echo. set /p "Select_Card=选择网卡[最多五张]:" if "%Select_Card%" == "1" ( set card=!name1! ) else ( if "%Select_Card%" == "2" ( set card=!name2! ) else ( if "%Select_Card%" == "3" ( set card=!name3! ) else ( if "%Select_Card%" == "4" ( set card=!name4! ) else ( if "%Select_Card%" == "5" ( set card=!name5! ) else ( echo. & echo 未键入任何参数! & pause>nul & cls & goto :Select_Card ))))) rem echo. & echo 选择网卡:%card% set NAME=%card%
第二、获取管理员权限
在运行一些批处理命令时,需要提供管理员权限才能运行,因此需要通过批处理来获取权限。
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
第三、设置IP、MASK等信息
前面介绍过采用netsh interface ip命令来设置、修改信息,如下:
netsh interface ip set address name=%NAME% source=dhcp
第四、获取当前IP
在获取当前IP信息时,采用ipconfig命令,并通过find命令查找需要的值信息做提取字符串处理。
for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do (set myip=%%i) for /f "tokens=15" %%m in ('ipconfig ^|findstr "子网掩码"') do (set mymask=%%m) for /f "tokens=15" %%g in ('ipconfig ^|findstr "默认网关"') do (set mygw=%%g) echo IP地址:%myip% echo 子网掩码:%mymask% echo 默认网关:%mygw% echo 更改IP地址完成!
第五、美化脚本及细节优化
批处理通过顺序执行,在实际过程中执行速度过快,上一步执行完成后,下一步紧接着执行,出现无法获取到值的情况,因此,在执行的过程中应适当的暂停等待,以便更好地获取数据。
# 暂停5s timeout /nobreak /t 5 >nul 2>&1 脚本美化 # 菜单选择 echo ============================== echo 脚本更换IP地址 echo.☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ echo ★ ★☆菜单☆★ ☆ echo ☆ 1.动态获取IP地址 ★ echo ★ 2.静态IP地址设置 ☆ echo ☆ 3.设置固定IP地址 ★ echo ☆ 4.网卡重新选择 ★ echo ★ 5.退出 ☆ echo.☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ set /p ID=请输入选择项目的序号: if "%ID%"=="1" goto AUTO if "%ID%"=="2" goto SETUP if "%ID%"=="3" goto TSGZ if "%ID%"=="4" goto Ethernet if "%ID%"=="5" goto EXIT echo 您没有选择修改方式。 到此整个过程已完毕!
03
赋完整代码
@echo off & setlocal enabledelayedexpansion color 0a ::获取管理者权限运行 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit ::获取网卡名称 :Ethernet echo 获取网卡名称 set m=0 for /f "tokens=1* delims=," %%a in ('Getmac /v /nh /fo csv') do ( set /a m+=1 set "name!m!=%%a" set "name=%name:~1,-1%" ) :Select_Card echo. & echo 1:!name1! & echo 2:!name2! & echo 3:!name3! & echo 4:!name4! & echo 5:!name5! & echo. set /p "Select_Card=选择网卡[最多五张]:" if "%Select_Card%" == "1" ( set card=!name1! ) else ( if "%Select_Card%" == "2" ( set card=!name2! ) else ( if "%Select_Card%" == "3" ( set card=!name3! ) else (if "%Select_Card%" == "4" ( set card=!name4! ) else ( if "%Select_Card%" == "5" ( set card=!name5! ) else ( echo. & echo 未键入任何参数! & pause>nul & cls & goto :Select_Card ))))) rem echo. & echo 选择网卡:%card% set NAME=%card% ::菜单选择 :menu echo ============================== echo 脚本更换IP地址 echo.☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ echo ★ ★☆菜单☆★ ☆ echo ☆ 1.动态获取IP地址 ★ echo ★ 2.静态IP地址设置 ☆ echo ☆ 3.设置固定IP地址 ★ echo ☆ 4.网卡重新选择 ★ echo ★ 5.退出 ☆ echo.☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ set /p ID=请输入选择项目的序号: if "%ID%"=="1" goto AUTO if "%ID%"=="2" goto SETUP if "%ID%"=="3" goto TSGZ if "%ID%"=="4" goto Ethernet if "%ID%"=="5" goto EXIT echo 您没有选择修改方式。 goto menu ::动态获取 :AUTO netsh interface ip set address name=%NAME% source=dhcp ipconfig /flushdns timeout /nobreak /t 5 >nul 2>&1 goto MYIP ::手动设置 :SETUP set /p IP1=请输入IP地址: set /p MASK1=请输入MASK地址: set /p GATEWAY1=请输入GATEWAY地址: set /p DNS1=请输入DNS1地址: set /p DNS2=请输入DNS2地址: if (%GATEWAY1%)==() ( goto NOTGATEWAY )else ( goto YESGATEWAY ) ::不设置网关 :NOTGATEWAY for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do ( set NEWIP=%%i goto out ) :out netsh interface ip delete address %NAME% addr=%NEWIP% gateway=all >nul 2>&1 netsh interface ip delete dns %NAME% all >nul 2>&1 netsh interface ip set address name=%NAME% source=static addr=%IP1% mask=%MASK1% netsh interface ip set dns name=%NAME% source=static addr=%DNS1% >null register=PRIMARY netsh interface ip add dns name=%NAME% addr=%DNS2% >null index=2 ipconfig /flushdns timeout /nobreak /t 5 >nul 2>&1 goto MYIP ::设置网关 :YESGATEWAY netsh interface ip delete dns %NAME% all >nul 2>&1 netsh interface ip set address name=%NAME% source=static addr=%IP1% mask=%MASK1% gateway=%GATEWAY1% gwmetric=1 netsh interface ip set dns name=%NAME% source=static addr=%DNS1% >null register=PRIMARY netsh interface ip add dns name=%NAME% addr=%DNS2% >null index=2 ipconfig /flushdns timeout /nobreak /t 5 >nul 2>&1 goto MYIP ::固定IP :TSGZ for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do ( set NEWIP=%%i goto out1 ) :out1 netsh interface ip delete address %NAME% addr=%NEWIP% gateway=all >nul 2>&1 netsh interface ip set address name=%NAME% source=static addr=192.168.1.1 mask=255.255.255.0 >nul 2>&1 netsh interface ip delete dns %NAME% all >nul 2>&1 timeout /nobreak /t 5 >nul 2>&1 goto MYIP ::退出 :EXIT timeout /nobreak /t 5 exit ::获取当前IP :MYIP for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do (set myip=%%i) for /f "tokens=15" %%m in ('ipconfig ^|findstr "子网掩码"') do (set mymask=%%m) for /f "tokens=15" %%g in ('ipconfig ^|findstr "默认网关"') do (set mygw=%%g) echo IP地址:%myip% echo 子网掩码:%mymask% echo 默认网关:%mygw% echo 更改IP地址完成! goto menu
以上就是整个完整的批处理脚本,以上代码还有优化,可根据实际工作需要调整脚本,优化冗余。本人刚开始学习批处理脚本,有不足之处望指正,在编写过程中参考过网友编写的类似脚本,感谢!!
-END-
标签: [Windows]
您阅读本篇文章共花了:
发表评论