具有echo findstr的批处理文件在for循环中不起作用

时间:2014-07-07 08:09:53

标签: batch-file for-loop echo findstr

我有一个来自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

1 个答案:

答案 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 0echo %%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}}