1

我是批处理脚本的新手。我试图编写一个批处理文件来遍历保存在注册表位置HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders的所有字符串值。并找到特定条件的结果。条件如下:“名称”字段以“Office14”结尾的字符串值”。我还想存储名称以“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 结尾)将存储在变量中。

4

1 回答 1

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%"
于 2013-08-27T11:31:07.693 回答