如何使用批处理脚本迭代注册表文件夹?

时间:2013-08-27 11:10:23

标签: windows batch-file registry

我是批处理脚本的新手。我正在尝试编写一个批处理文件来遍历保存在注册表位置的所有字符串值 HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ Folders 。并找到一定条件的结果。条件是这样的:一个字符串值'Name'字段以'Office14'结尾“。我还想存储注册表值的'Name'字段,其名称以'Office14'结尾。这是代码我正在使用它。

    @echo OFF

    set KEY_NAME="HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Folders"
    set OFFICE=OFFICE14\
    set RESULT="NOT FOUND"

    FOR %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"') DO (
       set ValueName=%%A
       REM Getting 9 characters from right i.e OFFICE14\ and comparing it to %OFFICE%
       set ValueName=%ValueName:~-9%
       IF %ValueName%==%OFFICE% (
           set RESULT="FOUND"
           goto :NEXT
       )
    )
    : NEXT
     echo %RESULT%

但是这里的结果始终是“未找到”。任何人都可以帮我修复这段代码,或者指出一些有用的文档来做同样的事情。

感谢。

编辑:名称的完整值(以Office14结尾)将存储在变量中。

1 个答案:

答案 0 :(得分:1)

reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Folders"|find /i "\Office14\" >nul 2>&1 && set "RESULT=FOUND"
echo %RESULT%

在回答问题后附加

目标字符串是:

     C:\Program Files\Microsoft Office\Office14\     REG_SZ

在这里获取路径名称有点困难,因为尾随空格/制表符。我建议使用sed for Windows的解决方案:

for /f "delims=" %%a in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Folders"^|sed -nr "/\\Office14\\/Is/\s+(.*)\s+REG_SZ/\1/p"') do SET "OFFICEPATH=%%~a"
echo %OFFICEPATH%

没有sed的更高级解决方案:

@ECHO OFF &SETLOCAL
for /f "tokens=*" %%a in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\Folders"^|find /i "\Office14\"') do SET "OFFICEPATH=%%a"
SET "right=REG_SZ%OFFICEPATH:*REG_SZ=%"
CALL SET "OFFICEPATH=%%OFFICEPATH:%right%=%%"
:loop
SET "OFFICEPATH=%OFFICEPATH:~0,-1%"
IF "%OFFICEPATH:~-1%"==" " GOTO :loop
ECHO "%OFFICEPATH%"