批处理设置IP,适用于Windows系统

※[全网最好用]※ 批处理设置IP

[2022.12.14更新]

· 增加判断已选择的网卡的状态,可选择设置为“启用”。
增加:
第39~45 (
:: ------------------------------------
for /f “tokens=2” %%a in (‘netsh interface show interface “!conName!” ^|findstr /c:“管理状态”’) do (
if “%conStaus%”==“已禁用” (
choice /m “. 当前网卡是禁用状态,是否启用?”
if !errorlevel! equ 1 netsh interface set interface “!conName!” “enabled”
if !errorlevel! equ 2 goto select1
)


[2022.12.10更新]

· 优化选择界面提示文字。
· 处理输入IP时,输入包含标点符号报错:“系统找不到指定的批处理标签 - .”。
修改前:
第102(call :judge_ip %INip%. INip)
第139(call :judge_ip %INmask%. INmask)
第145(… call :judge_ip %INgateway%. INgateway)
第223(set input=%1)# %~I,去掉任何引号


[2022.08.26更新]

· 把所有的注释行统一使用 “:: ” 开头,以便可以使用代码删除。

set /p "filename=输入要删除关键字的文件:"
set "keywords=:: "
type "%filename%"|findstr /R /V /C:"^:: " >"t.txt"

[2022.07.02更新]

· 处理了只有一个网卡时,出现的bug。
修改前:
第31(if !i! equ 1 set “conName=!conName1!” ……)


[2021.10.10更新]

· 在选择网卡列表处增加了控制面板中的网络连接,可以手动设置。


[2021.08.03更新]

· 增加了判断子网掩码部分。子网掩码的格式:^[1][1][1][1][1][1][1][1][1]*[0]*$,前面全是1(8~30个),后面全是0。
· 子网掩码可以输入对应位数,例如输入24,则对应的子网掩码是255.255.255.0.
· 算是完了。代码好长,最初只有一两行的。


[2021.07.15更新]

· 更改了所有pip pmask pgateway 为 INip INmask INgateway
· 默认子网掩码不再是固定的255.255.255.0。输入IP之后,增加了判断IP地址的类型,给出对应的默认子网掩码。
· 增加了网关可以为空,空网关时不判断输入是否正确,也不判断和IP是否在同一网段。
· 判断输入的IP是否正确 增加(if %%a equ 0 goto %back%),输入的第一个是0的也不通过。将原来调用call用for替代,使用(goto :eof)返回。
· 判断IP和网关是否在同一网段。通过和子网掩码AND得出的网络号是否相同判断。


[2021.06.11更新]

· 新增设置带多个网口的服务器,连接名称中带有空格的网卡,例如Windows Server 2016 命名方式为 "以太网 2” 之类的。
修改前:
第24(…… “tokens=1,2,4” ……)
第26(set conName!i!=%%c)
第27(echo. !i!. %%c %%a %%b)


[2021.04.15上传]

· 可以设置已有网卡的IP地址DHCP或者静态IP。
· 启用或禁用网卡。
· 适用于经常调试设备的,频繁修改电脑IP的同学们。


目前还没做子网掩码、网关的判断。

win7以下系统没试用过,不知道效果。

DNS是陕西的,其他地区的自行修改。(第9、10行)

以上内容中的行标数字,会更新。

:: 点击右侧复制按钮,复制以下内容。新建文本文档,修改后缀为.bat,双击运行即可。
@echo off
setlocal enabledelayedexpansion
:: 获取管理员权限。由大神依梦琴瑶提供
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
:: ------------------------------------
:: 预定义变量。默认子网掩码(dftmask)填写了固定值,则以下判断IP地址的类型给出对应的默认子网掩码部分失效。
set "dftmask="
set "dftdns1=1.2.4.8"
set "dftdns2=61.134.1.4"

:: ------------------------------------
:: 选择需要设置的连接
:select1
cls
set i=1
set "op="
color 0a
echo.
echo.             已有的连接:
echo.
echo.                 1. 手动设置:打开 [控制面板] ---^> [网络连接]
echo.
for /f "tokens=1,2,3*" %%a in ('netsh interface show interface^|findstr "连接"') do ( 
set /a i+=1
set op=!op!!i!
set conName!i!=%%d
echo.                 !i!. %%d	%%a	%%b
) 
if !i! equ 0 echo 未发现可设置的网卡&&pause>nul
if !i! equ 2 set "conName=!conName%i%!"&&goto select2
echo.
choice /c 1%op% /n /m ".            选择需要设置的连接:"
if %errorlevel% equ 1 ncpa.cpl&exit
set "conName=!conName%errorlevel%!"

:: ------------------------------------
:: 判断已选择的网卡是状态,可选择设置为“启用”。
for /f "tokens=2" %%a in ('netsh interface show interface "!conName!" ^|findstr /c:"管理状态"') do (
if "%%a"=="已禁用" (
choice  /m ".            当前网卡是禁用状态,是否启用?"
if !errorlevel! equ 1 netsh interface set interface "!conName!" "enabled"
if !errorlevel! equ 2 goto select1
)
)
cls

:: ------------------------------------
:: 选择设置方式
:select2
color 07
echo.
echo.             设置 [%conName%]       
echo.
echo.                 1. DHCP(自动获取IP)
echo.                 2. Static(设置静态IP)
echo.                 3. Static(增加静态IP)
echo.                 4. 启用网卡
echo.                 5. 禁用网卡
echo.                 6. 返回上一层
echo.
choice /c 123456 /n /m ".            请选择设置方式:"
cls

:: ------------------------------------
:: 设置DHCP
if %errorlevel% equ 1 (
netsh interface ip set address name="!conName!" source=dhcp 
netsh interface ip set dnsserver name="!conName!" source=dhcp 
ping -n 3 127.0.0.1>nul
goto end
)

:: ------------------------------------
:: 设置静态IP
if %errorlevel% equ 2 goto set_static
if %errorlevel% equ 3 (set errlev=3&&goto set_static)

:: ------------------------------------
:: 返回上一层
if %errorlevel% equ 6 goto select1

:: ------------------------------------
:: 启用/禁用网卡
if %errorlevel% equ 4 set state="enabled"
if %errorlevel% equ 5 set state="disabled"
netsh interface set interface "!conName!" %state%
goto end

:: ------------------------------------
:: 开始设置静态IP
:set_static
color 2f
cls
echo.
echo.                 开始设置[%conName%]的IP
echo.
:INip
set "INip="
set /p "INip=.                1.输入IP:"
:: call传参,变量后面加个点,防止变量空的时候,没有参数可传。没传参就回不来了
call :judge_ip "%INip%." INip
:: ------------------------------------
:: 判断IP地址的类型(A类、B类、C类)给出对应默认子网掩码
for /f "delims=." %%a in ("%INip%") do (
if %%a equ 127 (echo.                    127网段是特殊地址,重新设置。&&goto INip)
if %%a lss 127 (set "dftmask=255.0.0.0") else (
if %%a gtr 127 if %%a lss 192 (set "dftmask=255.255.0.0") else (
if %%a lss 224 set "dftmask=255.255.255.0"
)))
:: ------------------------------------
:INmask
set "INmask="
echo.                 2.输入子网掩码 (使用默认%dftmask%,直接按回车。也可以输入子网掩码的位数[8~30]):
set /p "INmask=.                   "
:: ------------------------------------
if "%INmask%"=="" (set INmask=%dftmask%) else (
set "bit="
echo %INmask%|findstr "^[0-9]*$">nul&&(set bit=%INmask%)
if not "!bit!"=="" (
if !bit! gtr 7 (
if !bit! lss 31 (
for /l %%a in (1 1 !bit!) do set mask_bin=!mask_bin!1
for /l %%a in (31 -1 !bit!) do set mask_bin=!mask_bin!0
for /l %%a in (0 8 31) do (
call set u=%%mask_bin:~%%a,8%%
call :Bin2Dec !u!
set mask=!mask!!dec_num!
if not %%a equ 24 set mask=!mask!.
)
set INmask=!mask!
set "mask="
set "mask_bin="
echo.                   输入的子网掩码为:!INmask!
) else (echo.输入的位数大于30&&goto INmask)
) else (echo.输入的位数小于8&&goto INmask)
))
:: ------------------------------------
call :judge_ip "%INmask%." INmask

:INgateway
set "INgateway="
echo.                3.输入网关IP(如果不需要设置网关,直接按回车)set /p "INgateway="
if not "%INgateway%"=="" call :judge_ip "%INgateway%." INgateway

:: ------------------------------------
:: 将IP、子网掩码、网关转换为二进制。
set i=1
for %%v in (%INip% %INmask% %INgateway%) do (
set "ip_bin="
for /f "delims=. tokens=1,2,3,4" %%a in ("%%v") do (
for %%i in (%%a %%b %%c %%d) do (
call :Dec2bin %%i
set ip_bin=!ip_bin!!bin_num!
))
if !i! equ 1 set INip_bin=!ip_bin!
if !i! equ 2 set INmask_bin=!ip_bin!
if !i! equ 3 set INgateway_bin=!ip_bin!
set /a i+=1
)
:: ------------------------------------
:: 判断子网掩码,IP是否匹配。
echo !INmask_bin!|findstr "^[1][1][1][1][1][1][1][1][1]*[0]*$">nul||(echo.                 子网掩码格式有误,核对后再输入:!INmask_bin!&&goto INmask)
set len=0
:len_loop1
call set u=%%INmask_bin:~!len!,1%%
if "!u!"=="1" (
set /a len+=1
goto len_loop1
)
set /a _len=32-!len!
call set host_num=%%INip_bin:~!_len!,!len!%%
set "aaa="
echo !host_num!|findstr "^[0]*$">nul&&set "aaa=网络号"
echo !host_num!|findstr "^[1]*$">nul&&set "aaa=广播号"
if not "!aaa!"=="" (
color 0c
echo.
echo.                 根据子网掩码计算,输入的IP为!aaa!,按任意键重新输入。
pause>nul
goto set_static
)
:: ------------------------------------
:: 判断IP和网关是否在同一网段。
if "%INgateway%"=="" goto dns1
for /l %%a in (0 1 31) do (
call set u1=%%INip_bin:~%%a,1%%
call set u2=%%INmask_bin:~%%a,1%%
call set u3=%%INgateway_bin:~%%a,1%%
:: 子网掩码等于1的部分和IP、网关进行AND计算,所以AND结果取决于IP、网关自身,子网掩码等于0的部分AND结果可以不要。
if "!u2!"=="1" (
set result1=!result1!!u1!
set result2=!result2!!u3!
))
if not "%result1%"=="%result2%" (
color 0c
echo.
choice /m ".                当前IP地址和网关不在同一网段,确认使用吗"
if !errorlevel! equ 2 (
set "result1=" 
set "result2="
goto set_static
))
:: ------------------------------------
:dns1
set /p "dns1=.                4.输入首选DNS (使用默认%dftdns1%,直接按回车):"
if "%dns1%"=="" set dns1=%dftdns1%
set /p "dns2=.                5.输入备用DNS (使用默认%dftdns2%,直接按回车):"
if "%dns2%"=="" set dns2=%dftdns2%

if "%errlev%"=="3" (
netsh interface ip add address "!conName!"  !INip! !INmask! !INgateway! gwmetric=2 
goto end )
netsh interface ip set address "!conName!" static !INip! !INmask! !INgateway! 
netsh interface ip set dns "!conName!" static !dns1! 
netsh interface ip add dns "!conName!" !dns2! index=2 
goto end 

:: ------------------------------------
:: 判断输入的IP是否规范(参考:https://www.jb51.net/article/18102.htm,用for取代其中的call语句)
:judge_ip
set input=%~1
set back=%2
echo %input%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.$">nul||goto %back%
for /f "delims=. tokens=1,2,3,4" %%a in ("%input%") do (
if %%a equ 0 goto %back%
if "%%d"=="" goto %back%
for %%i in (%%a %%b %%c %%d) do if %%i gtr 255 goto %back%
)
goto :eof

:: ------------------------------------
:Dec2bin
set dec_num=%1
set "bin_num="
:: 十进制转换为二进制数
:Dec2bin_loop
set /a quotient=%dec_num% / 2
set /a remainder=%dec_num% %% 2
set bin_num=%remainder%%bin_num%
if %quotient% gtr 1 (
set dec_num=%quotient%
goto Dec2bin_loop
)
if not %quotient% equ 0 set bin_num=%quotient%%bin_num%
if %1 gtr 127 goto :eof
:: 将二进制数格式化为长度8位
set len=0
:len_loop
call set u=%%bin_num:~!len!,1%%
if not "!u!"=="" (
set /a len+=1
goto len_loop
)
if %len% lss 8 (
set /a _len=8-%len%
for /l %%a in (1 1 !_len!) do set bin_num=0!bin_num!
)
goto :eof

:: ------------------------------------
:: 二进制数转十进制
:Bin2Dec
set "dec_num=0"
set bin_num=%1
for /l %%a in (0 1 7) do (
call set u=%%bin_num:~%%a,1%%
set /a power=7-%%a
if !u! equ 1 (
set mul=1
for /l %%b in (1 1 !power!) do set /a mul*=2
set /a dec_num+=!mul!
))
goto :eof
:: ------------------------------------
:end 
echo.    [!conName!] 已设置完成。
ping -n 4 127.1 >nul&&cls
netsh interface show interface
echo.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipconfig
for /l %%a in (10 -5 1) do (
echo.%%a秒后自动关闭窗口
ping -n 6 127.1 >nul
)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值