[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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命令,纯批实现,谢谢!

这样行不?只计算最后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. )
复制代码

TOP

本帖最后由 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
复制代码

TOP

如果只是为了不一样,其实没必要进行16进制的运行,直接找几个不一样的,将其中的替换掉就行了
例如直接将第一位按顺序替换成0,1,2,3,4,5,6,7,8,9。。。。。

TOP

回复 3# aloha20200628
感谢指出问题!主要是PE系统基本没有PS组件,只能纯批,只算最后两位或四位数也够。

TOP

本帖最后由 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"
复制代码

TOP

  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

评分人数

    • aries215: 感谢高手热心帮忙!技术 + 1
    • 77七: 技术高超!技术 + 1

TOP

  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

评分人数

    • 77七: 技术高超!技术 + 1

TOP

回复 6# aries215


    16进制运算没你想像的那么简单。

TOP

回复 5# aries215


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

TOP

本帖最后由 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
复制代码

TOP

返回列表