循环 Returns 意外结果

Loop Returns Unexpected Results

我写了一个批处理文件 (heavily influenced from answers to this question),它应该循环遍历几个键值和 return 第一个值不存在的实例。

问题是我似乎无法 return 一个不存在的值的第一个实例;它要么贯穿整个循环,要么 return 是一个实际存在的值。

我的代码:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE.0\Excel\Options"
REM set VALUE_NAME=OPEN

FOR %%V IN (OPEN OPEN1 OPEN2 OPEN3 OPEN4 OPEN5 OPEN6 OPEN7 OPEN8 OPEN9 OPEN10 OPEN11 OPEN12 OPEN13 OPEN14 OPEN15 OPEN16 OPEN17 OPEN18 OPEN19) DO (
    FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (
        set ValueName=%%A
        rem set ValueType=%%B
        rem set ValueValue=%%C
        if "%ValueName%"=="" (
            @echo %KEY_NAME%\%%V not found.
            PAUSE
            GOTO :ADD_KEY
        )
    )
)
CLS
echo loop finished
PAUSE
exit

:ADD_KEY
CLS
ECHO IT WORKED
PAUSE

在我的测试中,上面的代码 return 如下:

"HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE.0\Excel\Options"\OPEN not found

即使它确实存在于我的机器上。

如果我将 If 语句条件更改为 Not Defined ValueName,它 returns loop finished.

我在这里做错了什么?我可能遗漏了一些简单的东西,但我的 Google 搜索没有结果。

注意:这些值(OPEN、OPEN1、OPEN2 等)对应于 enabled Excel 加载项。

编辑

所以目前我的机器有值OPEN,但没有值OPEN1。这里的目标是在找到一个不存在的值(OPEN1 在这种情况下)循环将退出并执行代码的 ADD_KEY 部分。

遗憾的是,您没有告诉我们您的期望以及您期望的原因。

使用您的代码,ValueName 最初没有任何值,因此在第一个循环中,%%V 设置为 OPENif 语句被评估为 if ""=="" 因为你没有启用 delayedexpansion 而你正在使用 %ValueName%。因此,您会收到消息 ...OPEN.

如果您将 if 替换为 if defined 版本,那么您得到 loop finished 的事实意味着列表中的每个项目 (OPEN OPEN1...) 找到

我们不知道这在您的机器上是否属实。您可以通过故意删除您期望存在的密钥来对此进行测试。

AAMOI,set "ValueName=%%A" 是更好的语法,因为它使分配不受讨厌的不可见尾随空格的影响。

循环中的 @echo 可以安全地设为 echo。命令之前的所有 @ 都是为了抑制该命令的回显,因此最初的 @echo off 抑制回显,但需要自己抑制。

if "%%A"=="" 没有 delayedexpansion 也能完成同样的事情时,为什么要使用 if "%ValueName%"==""

修正案

FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (

如果reg queryreturns没有结果,不会执行do的主体。

尝试

FOR %%V IN (OPEN OPEN1 OPEN2 OPEN3 OPEN4 OPEN5 OPEN6 OPEN7 OPEN8 OPEN9 OPEN10 OPEN11 OPEN12 OPEN13 OPEN14 OPEN15 OPEN16 OPEN17 OPEN18 OPEN19) DO (

 set "ValueName="

 FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO (
  set ValueName=%%A
  rem set ValueType=%%B
  rem set ValueValue=%%C

 )
 if not defined ValueName (
  echo %KEY_NAME%\%%V not found.
  PAUSE
  GOTO ADD_KEY
 )
)

即设置valuename,使用内部for设置所需的值,如果失败(无输出来自 reg query) 那么你找到了一把丢失的钥匙。