循环 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
设置为 OPEN
,if
语句被评估为 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 query
returns没有结果,不会执行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
) 那么你找到了一把丢失的钥匙。
我写了一个批处理文件 (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
设置为 OPEN
,if
语句被评估为 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 query
returns没有结果,不会执行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
) 那么你找到了一把丢失的钥匙。