循环返回意外的结果

时间:2015-05-11 17:38:53

标签: batch-file for-loop registrykey

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

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

我的代码:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\15.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

在我的测试中,上面的代码返回以下内容:

"HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\15.0\Excel\Options"\OPEN not found

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

如果我将If语句标准更改为Not Defined ValueName,则会返回loop finished

我在这里做错了什么?我可能错过了一些简单的东西,但我的谷歌搜索却毫无结果。

注意:这些值(OPEN,OPEN1,OPEN2等)对应于启用的 Excel加载项。

修改

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

1 个答案:

答案 0 :(得分:1)

可悲的是,你没有告诉我们你的期望以及为什么你期待的是什么。

使用您的代码,ValueName最初将没有值,因此在第一个循环中,%%V设置为OPENif语句将被评估为{{1因为您尚未启用if ""==""并且您正在使用delayedexpansion。因此,您会收到消息%ValueName%

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

我们不知道您的计算机上是否属实。您可以通过故意删除您希望存在的密钥来测试它。

AAMOI,loop finished是更好的语法,因为它使分配免受恶劣的隐形尾随空间的影响。

循环中的set "ValueName=%%A"可以安全地@echo。命令之前的所有echo都是为了抑制该命令的回显,因此初始@抑制回显,但需要自己抑制。

为什么在没有@echo off if "%ValueName%"==""完成相同的事情时使用if "%%A"==""

修订

delayedexpansion

如果FOR /F "usebackq skip=2 tokens=1" %%A IN (`REG QUERY %KEY_NAME% /v %%V 2^>nul`) DO ( 没有返回任何结果,不会执行do的正文。

尝试

reg query

即,将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 ) ) 设置为 nothing ,使用内部valuename设置所需的值,如果失败({{1}没有输出})然后你发现了一个丢失的密钥。