我有一个来自for循环中的reg查询的多个字符串。 我想验证每个人是否有某些单词,如果有的话就行动。 我的代码是这样的:
for /l %%g in (0 1 3) do (
echo HOME%%g
for /f "tokens=1,2,3*" %%h in ('reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%%g /v ORACLE_HOME') do (
echo HOME%%g
echo %%j
echo %%j | findstr /I /R /C:"806"
if %ERRORLEVEL% equ 0 (
echo YES
) else (
echo NO
)
echo %%j | findstr /C:".isuites."
if %ERRORLEVEL% equ 0 (
echo YES
) else (
echo NO
)
echo %%j | findstr /I ora90
if errorlevel 0 (
echo YES
) else (
echo NO
)
echo %%j | findstr /I forms10
if errorlevel 0 (
echo YES
) else (
echo NO
)
)
)
问题是没有验证输出
中看到的字符串HOME0
HOME0
ECHO is off.
YES
YES
YES
YES
HOME0
d:\oracle\806
d:\oracle\806
YES
YES
YES
YES
HOME1
HOME1
ECHO is off.
YES
YES
YES
YES
HOME1
d:\oracle\iSuites
YES
YES
YES
YES
HOME2
HOME2
ECHO is off.
YES
YES
YES
YES
HOME2
d:\oracle\ora90
YES
YES
d:\oracle\ora90
YES
YES
HOME3
HOME3
ECHO is off.
YES
YES
YES
YES
HOME3
D:\oracle\forms10g
YES
YES
YES
D:\oracle\forms10g
YES
答案 0 :(得分:2)
您的代码中需要进行一些更正
将for %%h
更改为
for /f "tokens=1,2,*" %%h in ('reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%%g /v ORACLE_HOME ^| find "REG_SZ" ') do (
这样,ORACLE_HOME
密钥名称将位于%%h
中,REG_SZ
类型位于%%i
中,而%%j
中的文件夹位于errorlevel
中(我认为这是你的意图)
完成此操作后,下一个问题是%errorlevel%
检查
当解析代码块(括号内的代码)时,所有变量读取都将替换为变量中的值开始执行块之前。因此,如果在代码块中使用setlocal enabledelayedexpansion
,因为在开始执行之前,此变量读取已替换为变量的值,您将看不到实际值。
您可以使用延迟扩展(在批处理文件的开头包含%errorlevel%
)并将语法从!errorlevel!
更改为if errorlevel n ...
,以向解析器指示应该延迟变量读取直到命令执行的那一刻。
或者您可以使用errorlevel
语法。在这种情况下,您应该记住,对于大于或等于指示值的任何errorlevel
值,条件都为真。
也就是说,如果if errorlevel 1
为1,则if errorlevel 0
和echo %%j | findstr .....
if errorlevel 1 (
...
) else (
...
)
都将为真。因此,检查错误级别的正确方法是从较大的值检查到较低的值
....
....
for /l %%g in (0 1 3) do (
echo Testing HOME%%g
echo ---------------------------------
for /f "tokens=1,2,*" %%h in (
'reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%%g /v ORACLE_HOME 2^>nul ^| find "REG_SZ" '
) do (
echo %%j | findstr /L /C:"806"
if errorlevel 1 (
echo NO
) else (
echo YES
)
echo %%j | findstr /C:".isuites."
if errorlevel 1 (
echo NO
) else (
echo YES
)
echo %%j | findstr /I /C:"ora90"
if errorlevel 1 (
echo NO
) else (
echo YES
)
echo %%j | findstr /I /C:"forms10"
if errorlevel 1 (
echo NO
) else (
echo YES
)
)
)
)
所以,你的代码应该是
HOMEn
已修改以适应评论
如果注册表中不存在某些req query
,则不会回显它们。为了“解决”它,ERROR:
的错误输出包含在要解析的数据中,如果找到字符串for /l %%g in (0 1 3) do (
echo Testing HOME%%g
echo ---------------------------------
for /f "tokens=1,2,*" %%h in (
'reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%%g /v ORACLE_HOME 2^>^&1 ^| findstr /L /C:"REG_SZ" /C:"REG_EXPAND_SZ" /C:"ERROR:" '
) do (
for %%z in ("806" ".isuites." "ora90" "forms10") do (
(if "%%h"=="ERROR:" (echo() else (echo %%j)) | findstr /i /c:"%%~z"
if errorlevel 1 (
echo NO
) else (
echo YES
)
)
)
)
)
则对其进行测试。
{{1}}