Board logo

标题: [注册表类] [已解决]批处理如何根据网卡ID读取注册表值,判断文件名、搜索、修改指定文本? [打印本页]

作者: wrz99    时间: 2011-7-25 15:50     标题: [已解决]批处理如何根据网卡ID读取注册表值,判断文件名、搜索、修改指定文本?

可以了,2003和XP系统都没有问题了!
曾经为了这个问题头大了半年啊!

现在的心情很激动,实在太感谢tmplinshi版主,谢谢你!




如何根据网卡硬件ID 读取注册表值,自动判断文件名、搜索、修改指定文本?

目地:自动识别当前网卡型号,并导入优化文件。


首先,以8111D网卡为例:我用“devcon.exe hwids PCI\CC_0200 >>c:\网卡ID.txt”命令

得到的网卡型号:PCI\VEN_10EC&DEV_8168&SUBSYS_23091565&REV_03\4&2BA546C5&0&0038   (如下图)(型号8168,版本REV_03  即8111D网卡)
同为VEN_10EC&DEV_8168,但如果REV版本号不一样,型号也就不一样,关系如下
8111D:     REV_03
8111DP/DL: REV_04
8111E:     REV_06
8111F:     REV_07
8111ES:    REV_08
[attach]4163[/attach]
[attach]4163[/attach]
注:视其它网卡不存在这种版本号区别。

第一步:.根据网卡ID,自动读取HKLM\SYSTEM\ControlSet001\Enum\PCI\VEN_10EC&DEV_8168&SUBSYS_23091565&REV_03\4&2BA546C5&0&0038下的Driver值 最后面的4位数字。(如下图)
Driver={4D36E972-E325-11CE-BFC1-08002BE10318}\0008



第二步:.(如下图)还是根据PCI\VEN_10EC&DEV_8168&SUBSYS_23091565&REV_03\4&2BA546C5&0&0038,自动搜索D:\网卡优化\下的同名.REG文件,并用"第一步"得到的值 替换掉同名文件中HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\的后4位数字.


第三步:. regedit /s "当前修改后的.reg文件"
作者: wrz99    时间: 2011-7-25 15:51

本帖最后由 wrz99 于 2011-7-25 16:50 编辑

为能简单明了,此贴我用了近3小时精炼文字。。

不知大家能明白我的意图没有?

DevCon官方下载地址:
立即下载 DevCon 软件包。 (http://download.microsoft.com/do ... 7f3e0240/devcon.exe) 发布日期:2003 年 1 月 29 日


VEN_10EC&DEV_8168&REV_03.reg


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0008]

;(禁止)网卡关闭节约用电(禁56-或dword:00000038,开48,十进制值)
"nPCapabilities"=dword:00000038

;(关闭)大量传送减负
"Largesend"="0"

;(关闭)关机 网络唤醒
"S5WakeOnLan"="0"

;(关闭)环保节能
"GreenEthernet"="0"

;(关闭)流控制
"FlowControl"="0"

;(关闭)网路唤醒模式
"WolCap"="0"

;(关闭)硬件校验和
"CksOffload"="0"

;(关闭)自动关闭 PCIe (省电)
"AutoLinkDownPcieMacOff"="0"

;(关闭)自动关闭 PHY (省电)
"AutoLinkDownPhyOff"="0"
作者: tmplinshi    时间: 2011-7-25 17:46

  1. @echo off
  2. devcon.exe hwids PCI\CC_0200 >c:\网卡ID.txt
  3. set /p var=<c:\网卡ID.txt
  4. :: 搜索注册表
  5. set RegPath="HKLM\SYSTEM\ControlSet001\Enum\PCI\%var:*PCI\=%"
  6. for /f "skip=4 tokens=*" %%a in ('reg query %RegPath% /v Driver') do (
  7.     set Driver=%%~na
  8. )
  9. :: 修改 reg 文件
  10. for /f "tokens=2,3,5 delims=\&" %%a in ("%var%") do (
  11.     set RegFile="D:\网卡优化\%%a&%%b&%%c.reg"
  12. )
  13. set SearchStr=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class
  14. set SearchStr=%SearchStr%\{4D36E972-E325-11CE-BFC1-08002bE10318}\
  15. findstr /n .* %RegFile% >.tmp
  16. (
  17.     for /f "delims=" %%a in (.tmp) do (
  18.         set var=%%a
  19.         setlocal enabledelayedexpansion
  20.         if "!var:%SearchStr%=!" neq "!var!" (
  21.             set var=!var:\%%~na=\%Driver%!
  22.         )
  23.         echo,!var!
  24.         endlocal
  25.     )
  26. ) >%RegFile%
  27. del .tmp
  28. regedit /s %RegFile%
  29. pause
复制代码

作者: wrz99    时间: 2011-7-25 19:10

本帖最后由 wrz99 于 2011-7-25 19:23 编辑

谢谢版主,我先去试试看!


出现2个问题:
1.网卡优化 目录下会生成一个同名空白的.REG文件.
2.文本内容并没有被修改!
3.能否有个提示,获取的4位数是多少就更好了!
作者: tmplinshi    时间: 2011-7-25 19:35

本帖最后由 tmplinshi 于 2011-7-25 19:36 编辑

回复 4# wrz99

运行下面的代码,把结果贴上来。
  1. @echo off
  2. devcon.exe hwids PCI\CC_0200 >网卡ID.txt
  3. echo,
  4. echo ============
  5. type 网卡ID.txt
  6. echo ============
  7. echo,
  8. set /p var=<网卡ID.txt
  9. :: 搜索注册表
  10. set RegPath="HKLM\SYSTEM\ControlSet001\Enum\PCI\%var:*PCI\=%"
  11. for /f "skip=4 tokens=*" %%a in ('reg query %RegPath% /v Driver') do (
  12.     set Driver=%%~na
  13. )
  14. set Driver
  15. echo,
  16. echo ============
  17. reg query %RegPath% /v Driver
  18. echo ============
  19. echo,
  20. :: 修改 reg 文件
  21. for /f "tokens=2,3,5 delims=\&" %%a in ("%var%") do (
  22.     set RegFile="D:\网卡优化\%%a&%%b&%%c.reg"
  23. )
  24. set RegFile
  25. pause
  26. exit
复制代码

作者: wrz99    时间: 2011-7-25 20:56

本帖最后由 wrz99 于 2011-7-25 21:18 编辑

1.提示“环境变量 Driver 没有定义”

2.文本内容并没有被修改!
作者: tmplinshi    时间: 2011-7-26 13:54

回复 6# wrz99


你运行 5 楼的批处理后,当前目录下的“网卡ID.txt”文件为空吗?如果为空的话,之后的代码必然是无法运行的。那句 devcon 的代码也是你提供的。
作者: wrz99    时间: 2011-7-26 16:27

这是运行后的载图
说明:已经正确获取到网卡ID,只是没有正确修改.reg文件

作者: wrz99    时间: 2011-7-26 16:30

回复 7# tmplinshi

硬件ID已获取成功,只是没有修改reg文件。请您再看看!我已经截图!
作者: tmplinshi    时间: 2011-7-26 17:36

本帖最后由 tmplinshi 于 2011-7-26 18:06 编辑

回复 8# wrz99

请问你用的是什么系统?竟然 reg query 的输出与 XP SP2 的不同,XP SP2 下的输出是这样的:
  1. 空行
  2. ! REG.EXE VERSION 3.0
  3. 空行
  4. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_10EC&DEV_8139&SUBSYS_813910EC&REV_10\4&29817089&0&08F0
  5.     Driver REG_SZ {4D36E972-E325-11CE-BFC1-08002BE10318}\0001
  6. 空行
复制代码
再试试:
  1. @echo off
  2. setlocal
  3. devcon.exe hwids PCI\CC_0200 >c:\网卡ID.txt
  4. set /p var=<c:\网卡ID.txt
  5. :: 搜索注册表
  6. set Driver=
  7. set RegPath="HKLM\SYSTEM\ControlSet001\Enum\PCI\%var:*PCI\=%"
  8. for /f "tokens=*" %%a in ('reg query %RegPath% /v Driver') do (
  9.     set Driver=%%~na
  10. )
  11. if not defined Driver (
  12.     echo 获取 Driver 失败。按任意键退出...
  13.     pause >nul
  14.     exit /b
  15. ) else (
  16.     set Driver
  17. )
  18. :: 修改 reg 文件
  19. for /f "tokens=2,3,5 delims=\&" %%a in ("%var%") do (
  20.     set RegFile="D:\网卡优化\%%a&%%b&%%c.reg"
  21. )
  22. set SearchStr=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class
  23. set SearchStr=%SearchStr%\{4D36E972-E325-11CE-BFC1-08002bE10318}\
  24. type %RegFile% | findstr /n .* >.tmp
  25. (
  26.     for /f "delims=" %%a in (.tmp) do (
  27.         set var=%%a
  28.         setlocal enabledelayedexpansion
  29.         if "!var:%SearchStr%=!" neq "!var!" (
  30.             set var=!var:\%%~na=\%Driver%!
  31.         )
  32.         echo,!var:*:=!
  33.         endlocal
  34.     )
  35. ) >%RegFile%
  36. del .tmp
  37. regedit /s %RegFile%
  38. pause
复制代码

作者: wrz99    时间: 2011-7-26 17:44

没有错误提示,但原文件内容被清空!


作者: wrz99    时间: 2011-7-26 17:45

本帖最后由 wrz99 于 2011-7-26 17:49 编辑

对了,我的系统是2003,我在XP下面去试试!

在XP下测试也是一样,程序好像建立了一个同名文件,但内容为空!
作者: tmplinshi    时间: 2011-7-26 17:54

本帖最后由 tmplinshi 于 2011-7-26 17:58 编辑

回复 12# wrz99


请重新复制一下 10 的代码。与 3 楼的代码相比,一共修改了两处错误:

1、
for /f "skip=4 tokens=*" %%a in ('reg query %RegPath% /v Driver') do (
    set Driver=%%~na
)

改成了 "tokens=*"

2、
findstr /n .* %RegFile% >.tmp

改成了
type %RegFile% | findstr /n .* >.tmp
作者: wrz99    时间: 2011-7-26 18:05

本帖最后由 wrz99 于 2011-7-26 18:07 编辑

终于可以正确修改注册表了,

但是无法导入!XP和2003都是一样!

注册表前面多了,序号和分号!


作者: tmplinshi    时间: 2011-7-26 18:08

回复 14# wrz99


太粗心了,忘记了去掉开头的行号。已修改 10 楼代码。
作者: wrz99    时间: 2011-7-26 18:18

可以了,2003和XP系统都没有问题了!
曾经为了这个问题头大了半年啊!

现在的心情很激动,实在太感谢tmplinshi版主,谢谢你!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2