我编写了一个批处理文件(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
部分。
答案 0 :(得分:1)
可悲的是,你没有告诉我们你的期望以及为什么你期待的是什么。
使用您的代码,ValueName
最初将没有值,因此在第一个循环中,%%V
设置为OPEN
,if
语句将被评估为{{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}没有输出})然后你发现了一个丢失的密钥。