找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15862|回复: 10

[网络连接] [不问了]如何修改多个MAC地址?关于十六进制循环加减

[复制链接]
发表于 2024-8-30 22:12:25 | 显示全部楼层 |阅读模式
本帖最后由 aries215 于 2024-8-31 13:26 编辑
  1. for  /f "tokens=*" %%i in ('reg query "HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v /f "FlowControl" ^|findstr /i "{"') do (
  2.         reg add "%%~i" /f /v "NetworkAddress" /t REG_SZ /d "A0B0C0D0E0F0" >nul
  3. )
复制代码
如今不少电脑都有2~4个网口,MAC地址也相应变多。上面代码会改为同一个MAC地址造成冲突,如何改为不同数值。
也就是for每循环一次就把A0B0C0D0E0F0位数增大1,即十六进制循环加减。
不用wmic命令,纯批实现,谢谢!
发表于 2024-8-31 00:44:40 | 显示全部楼层
这样行不?只计算最后2个16进制位,256个网口以内

  1. @echo off

  2. set _@@addr=A0B0C0D0E0F0

  3. set ___=□0□1□2□3□4□5□6□7□8□9□A□B□C□D□E□F
  4. setlocal enabledelayedexpansion
  5. set ___=!%___:□=!!___:□=□%!
  6. endlocal&set ___=%___:□=%

  7. set /a _@@a=0x%_@@addr:~-2%*2

  8. for  /f "tokens=*" %%i in ('reg query "HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v /f "FlowControl" ^|findstr /i "{"') do (
  9. setlocal enabledelayedexpansion
  10. if !_@@a! geq 512 set _@@a=0
  11. for %%q in ("!_@@a!") do (
  12. reg add "%%~i" /f /v "NetworkAddress" /t REG_SZ /d "%_@@addr:~0,10%!___:~%%~q,2!"  >nul
  13. )
  14. for %%q in ("!_@@a!") do endlocal&set _@@a=%%~q
  15. set /a _@@a+=2
  16. )
复制代码
发表于 2024-8-31 12:08:20 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-31 12:16 编辑

回复 1# aries215

一楼示例中的地址数值已超过批处整数极限,若楼主可用 powershell 试试以下代码...

  1. @echo off &setlocal enabledelayedexpansion
  2. set "ip=0xA0B0C0D0E0F0"
  3. for /f "tokens=*" %%i in (
  4.         ' reg query "HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v /f "FlowControl" ^|findstr /i "{" '
  5. ) do (
  6.         reg add "%%~i" /f /v "NetworkAddress" /t REG_SZ /d "!ip!" >nul
  7.         for /f %%p in (' powershell "(!ip!+1).ToString('x')" ') do set "ip=0x%%p"
  8. )
  9. endlocal&pause&exit/b
复制代码
发表于 2024-8-31 12:21:06 | 显示全部楼层
如果只是为了不一样,其实没必要进行16进制的运行,直接找几个不一样的,将其中的替换掉就行了
例如直接将第一位按顺序替换成0,1,2,3,4,5,6,7,8,9。。。。。
 楼主| 发表于 2024-8-31 13:20:37 | 显示全部楼层
回复 3# aloha20200628
感谢指出问题!主要是PE系统基本没有PS组件,只能纯批,只算最后两位或四位数也够。
 楼主| 发表于 2024-8-31 13:25:18 | 显示全部楼层
本帖最后由 aries215 于 2024-9-1 12:10 编辑

回复 4# Five66
确实啊,我以为增加两三行就能解决,看了你们写的比我预想的复杂,那我干脆手工改改好了,毕竟电脑买来会用好多年。
  1. reg add "HKLM\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0000" /f /v "NetworkAddress" /t REG_SZ /d "A0B0C0D0E0F0"
  2. reg add "HKLM\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001" /f /v "NetworkAddress" /t REG_SZ /d "A0B0C0D0E0F1"
复制代码
发表于 2024-8-31 13:34:30 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "mac=A0B0C0D0E0F0"
  4. set "reg=HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"
  5. set "str=0123456789ABCDEF"

  6. for /f "tokens=*" %%i in ('reg query "%reg%" /s /v /f "FlowControl" ^| findstr "{"') do (
  7.     set "res="
  8.     set /a x=n+=1
  9.     for /L %%j in (1,1,12) do (
  10.         set /a sum=0x!mac:~-%%j,1! + x, m=sum%%16, x=sum/16
  11.         for %%k in (!m!) do (
  12.             set "res=!str:~%%k,1!!res!"
  13.         )
  14.     )
  15.     reg add "%%~i" /v "NetworkAddress" /d "!res!" /f
  16. )
  17. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
aries215 + 1 感谢高手热心帮忙!
77七 + 1 技术高超!

查看全部评分

发表于 2024-8-31 13:37:23 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "mac=A0B0C0D0E0F0"
  4. set "reg=HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"

  5. for /f "tokens=*" %%i in ('reg query "%reg%" /s /v /f "FlowControl" ^|findstr "{"') do (
  6.     set /a n = 0x!mac:~6! + 1
  7.     cmd /c exit /b !n!
  8.     set "res=!=exitCode!"
  9.     set /a n = 0x!mac:~0,6! + 0x!res:~0,2!
  10.     cmd /c exit /b !n!
  11.     set mac=!=exitCode:~2!!res:~2!
  12.     reg add "%%~i" /v "NetworkAddress" /t REG_SZ /d "!mac!" /f
  13. )
  14. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 技术高超!

查看全部评分

发表于 2024-8-31 13:41:58 | 显示全部楼层
回复 6# aries215


    16进制运算没你想像的那么简单。
发表于 2024-8-31 14:25:21 | 显示全部楼层
回复 5# aries215


   没有ps组件可以试试去下个lua,500多k的大小,基本语言功能该有的都有(可谓麻雀虽小五脏俱全),而且是二进制程序,速度比ps快好多好多倍
批处理文件直接用
lua -e "print(string.format('%%X',tostring((0xA0B0C0D0E0F0+1))))"
就能输出对应的16进制值了,将数据换成变量放进 for /f 里后使用就能达到目的了
发表于 2024-8-31 16:18:20 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-31 16:44 编辑

回复 5# aries215

那就再给一个无须调用任何外部资源的纯P版本,从 0xD0E0F0 起算直至6位0x数封顶0xFFFFFF(在批处整数计算能力内),其结果再拼接成 0x0xA0B0C0...... 12位ip地址,代码中的子过程其实就是一个用纯P转换10进制为16进制字符串的方法(0-2147483647 》0-0x7FFFFFFF)

  1. @echo off &setlocal enabledelayedexpansion
  2. set "ip=0xA0B0C0D0E0F0" &set "x0=0xA0B0C0"
  3. set "w=HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}"
  4. for /f "tokens=*" %%i in (' reg query "%w%" /s /v /f "FlowControl" ^|findstr /i "{" ') do (
  5.         reg add "%%~i" /f /v "NetworkAddress" /t REG_SZ /d "!ip!" >nul
  6.         set/a "n=0x!ip:~-6!+1" &set "x=," & (call :xp16)
  7. )
  8. endlocal&exit/b
  9. :xp16
  10.         set/a "r=n%%16,n=n/16" &set "x=,!r!!x!" &if !n! gtr 0 goto :xp16
  11.         for %%k in ("10=A" "11=B" "12=C" "13=D" "14=E" "15=F") do set "x=!x:%%~k!"
  12.         set "ip=!x0!!x:,=!" &exit/b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 18:48 , Processed in 0.023814 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表