-1

我正在寻找一个批处理文件来执行一个非常具体的功能:

搜索注册表项“\HKLM\SYSTEM\CurrentControlSet\Control\Class{4D36E972-E325-11CE-BFC1-08002bE10318}”

查找包含特定文本字符串的所有子项,在本例中为“DriverDesc”值中的“Intel”

仅在“DriverDesc”值中包含“Intel”的键中将“PnPCapabilities”值数据更改为“38”(十六进制)

我知道如何分别做这些事情,但我不能让它们在一个批次中一起工作。我对批处理语言的了解仍然太有限,不知道如何自己正确完成,或者破译和修改现有的批处理。

为了让事情不那么混乱,我正在尝试禁用一对英特尔 NIC 卡的电源管理选项。我想做一个批处理,它会在任何机器上自动执行此操作,无论存在哪些其他 NIC,或者它们的安装顺序如何。

任何帮助将不胜感激。

以下是我发现、尝试和失败的内容:
编辑:新批次
EDIT2:新批次,正在工作

:start
setlocal ENABLEDELAYEDEXPANSION
set qry=reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v DriverDesc
for /f "Tokens=*" %%p in ('%qry%') do (
 set var=%%p
 set var=!var:^&=!
 set var=!var:^)=!
 set var=!var:^(=!
 call :parse
)
endlocal
goto :EOF
:parse
if /i "%var:~0,5%" NEQ "HKEY_" goto parse1
set key=%var%
set key=%key:HKEY_LOCAL_MACHINE=HKLM%
goto :EOF
:parse1
setlocal ENABLEEXTENSIONS
for /f "Tokens=*" %%f in ('@echo %var%^|findstr /i /c:"Intel(R)"') do (
  if defined key reg add %key% /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
)
endlocal >nul 2>&1

已修复,以便它执行预期的操作。

4

2 回答 2

0

好吧,一方面,你不要\在 HKEY 前面放 a,另一方面\Class{4D36E972-E325-11CE-BFC1-08002bE10318}应该是\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}. 此外,您实际上并不需要双引号。

所以让你的第三行:

set qry=reg query HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318} /s

这条线似乎有问题:

call :parse2>nul 2>&1

可能会调用parse并通过管道stderr传输到nul,然后将其重定向到stdout. 至少在:parse2and之间留一个空格>nul 2>&1

parse2您可以通过将其拉入parse1并附加到or语句>nul 2>&1的末尾来消除问题,如下所示:forif

:parse1
for /f "Tokens=*" %%f in ('@echo %line%^|findstr /i /c:"Intel(R)" ^|findstr /i /c:"DriverDesc"') do (
  if defined key reg add "\%key%" /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
) >nul 2>&1

这就是我跳出来的一切。但在你将这些东西泵回你的注册表之前,我建议你先将它通过管道传输到一个文件中。这样,您可以检查以确保所有内容都正确格式化,您甚至可以从文件中剪切几行并将其粘贴到命令提示符中,以查看是否reg以您预期的方式做出反应。这样,如果您犯了错误,您就不会冒着在工业规模上搞砸您的注册表的风险。

哦,是的,并且至少备份您要修改的注册表部分,以便您可以将其恢复到之前的状态。你知道,以防万一。:D


编辑:回答您更新的问题:

您的if语句永远不会运行,因为不知何故%line%被设置为line:查看您的“输出”。

For 扩展变量 !line! 然后运行@echo line: |findstr /i /c:"vmxnet3" |findstr /i /c:"DriverDesc"它会导致一个空行,因为文字字符串“ line:”将不匹配其中之一,更不用说您的两个搜索字符串了。

由于for忽略空行,您的if语句永远不会运行。

For的评估必须产生DO要运行的命令的数据。

于 2012-09-21T08:35:24.857 回答
0

以下是工作批次。感谢 James K 帮助我找到正确的方向。

:start
setlocal ENABLEDELAYEDEXPANSION
    set qry=reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}" /s /v DriverDesc
    for /f "Tokens=*" %%p in ('%qry%') do (
        set var=%%p
        set var=!var:^&=!
        set var=!var:^)=!
        set var=!var:^(=!
        call :parse
    )
endlocal
goto :EOF
:parse
if /i "%var:~0,5%" NEQ "HKEY_" goto parse1

set key=%var%
set key=%key:HKEY_LOCAL_MACHINE=HKLM%
goto :EOF

:parse1
setlocal ENABLEEXTENSIONS
    for /f "Tokens=*" %%f in ('@echo %var%^|findstr /i /c:"Intel(R)"') do (
        if defined key reg add %key% /v PnPCapabilities /t REG_DWORD /d 56 /f&set key=
    )
endlocal >nul 2>&1
于 2012-10-02T16:46:49.180 回答