羌戎🌱笔记

羌戎🌱笔记

Windows采用脚本更换IP地址

0 2924

本文最后更新于7月前,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

最近在客户现场使用不同的网络,经常要设置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-

标签: 系统

您阅读本篇文章共花了: 

发表评论

验证码