循环通过win 7注册表来查找密钥的值

时间:2015-04-06 19:01:26

标签: windows batch-file registry

在previuos问题中,我需要在win 7注册表(REG ADD - Invalid syntax)中的密钥中编辑一个值。现在我需要循环通过配置文件来查找特定的键,其中子键的值是字符串“Network”。

注册表如下所示: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkList \ Profiles \ 使用这些子项:

{1C2​​A5700-E8E8-41C0-9684-6FB69FA73888}

ProfileName REG_SZ SomethingElse

{7AA5E1AE-2408-4B92-9C56-8962CD9E926C}

ProfileName REG_SZ网络

这是我的reg命令

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" /s /v ProfileName

我想找到子键“ProfileName”等于“Network”的键名。 我知道我将不得不使用FOR循环,但我知道如何做到这一点。

我的最终结果应该返回关键字{7AA5E1AE-2408-4B92-9C56-8962CD9E926C}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这样的事情可能有所帮助:

@echo off    
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" /d /f "Network" /s /e
pause

我还没有对它进行测试,但是通过遵循this中的详细信息,我猜测它应该执行所需要的。

修改

单独提取子项名称...

@echo off

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" /d /f "Network" /s /e > result.txt
for /f "tokens=1*delims=:" %%i in ('findstr /n "^" result.txt') do if %%i equ 2 echo %%~nj
del /q result.txt
pause

答案 1 :(得分:0)

@ECHO off
SETLOCAL EnableDelayedExpansion

SET "NTKEY=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
SET "PROFKEY=%NTKEY%\NetworkList\Profiles"
GOTO main

:findprof
SET "profname=%~1"
SET "presult=%~2"
FOR /f "tokens=1,3 delims={} " %%I in (
       'reg.exe query "%PROFKEY%" /s /v ProfileName') DO (
    SET "tmp=%%I"
    IF "!tmp:~0,19!" == "HKEY_LOCAL_MACHINE\" (
        SET "tresult=%%J"
    ) ELSE IF "%%J" == "%profname%" (
        SET "%presult%={!tresult!}"
        EXIT /B 0
    )
)
EXIT /B 1

:usage
(
    ECHO The syntax of this command is:
    ECHO. 
    ECHO     %1 profile_name
) 1>&2
GOTO :eof

:main
SET "profname=%~1"
IF NOT DEFINED profname (
    CALL :usage %~nx0
    EXIT /B 1
)
CALL :findprof %profname% result
IF errorlevel 1 (
    ECHO Profile not found.
) 1>&2 ELSE (
    ECHO %result%
)

findprof子例程中的循环标记了空格和大括号上reg.exe输出的每一行。如果第一个标记以" HKEY_LOCAL_MACHINE \"开头,则将当前密钥名称设置为第三个标记。然后,如果在后续行中第三个令牌与目标配置文件名称匹配,则它返回'将当前键名设置为输出参数的传入名称(有点像通过引用传递)。错误级别设置为适当,错误输出打印到stderr

示例:

C:\>findprof        
The syntax of this command is:

    findprof.bat profile_name

C:\>findprof spam
Profile not found.

C:\>findprof Network
{7AA5E1AE-2408-4B92-9C56-8962CD9E926C}