批处理以查询注册表项,在该注册表项中找到一个字符串,然后创建一个新的注册表项



我想创建一个批处理文件,它将执行一个非常特定的功能:

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

查找包含特定文本字符串的所有子键,在本例中为"DriverDesc"值中的"Intel">

仅在"DriverDesc"值中包含"Intel"的密钥中将"PnPCapabilities"值数据更改为"38"(十六进制)

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

为了减少混乱,我尝试禁用一对Intel NIC卡的电源管理选项。我想制作一个批,在任何机器上自动执行此操作,无论存在什么其他NIC,也不管它们的安装顺序如何。

如有任何帮助,我们将不胜感激。

以下是我的发现、尝试和失败:
编辑:新批次
编辑2:工作的新批次

:start
setlocal ENABLEDELAYEDEXPANSION
set qry=reg query "HKLMSYSTEMCurrentControlSetControlClass{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

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

好吧,一方面,您没有在HKEY前面放一个,另一方面,Class{4D36E972-E325-11CE-BFC1-08002bE10318}应该是Class{4D36E972-E325-11CE-BFC1-08002bE10318}。此外,你并不真的需要双引号。

所以做你的第三行:

set qry=reg query HKLMSYSTEMCurrentControlSetControlClass{4D36E972-E325-11CE-BFC1-08002bE10318} /s

这条线似乎有问题:

call :parse2>nul 2>&1

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

您可以通过将parse2拉入parse1并将>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扩展变量!线然后运行@echo line: |findstr /i /c:"vmxnet3" |findstr /i /c:"DriverDesc",结果是一个空行,因为文字字符串"line:"与其中一个不匹配,更不用说两个搜索字符串了。

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

For的求值必须为要运行的DO之后的命令生成数据。

以下是工作批次。感谢詹姆斯K帮我找到了正确的方向。

:start
setlocal ENABLEDELAYEDEXPANSION
set qry=reg query "HKLMSYSTEMCurrentControlSetControlClass{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

相关内容

最新更新