Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file echo findstr在for循环内部不工作的批处理文件_Batch File_For Loop_Echo_Findstr - Fatal编程技术网

Batch file echo findstr在for循环内部不工作的批处理文件

Batch file echo findstr在for循环内部不工作的批处理文件,batch-file,for-loop,echo,findstr,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

我有多个字符串来自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
            )



        )
    )
问题是is没有像输出中那样验证字符串

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

代码中需要一些更正

将%%h的
更改为

for /f "tokens=1,2,*" %%h in ('reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%%g /v ORACLE_HOME ^| find "REG_SZ" ') do ( 
这样,
ORACLE\u HOME
键名将位于
%%h
中,
REG\u SZ
键入
%%i
,文件夹位于
%%j
(我想这是您想要的)

完成此操作后,下一个问题是
errorlevel
检查

解析代码块(括号内的代码)时,在开始执行该块之前,所有变量读取都将替换为变量内的值。因此,如果在代码块中使用
%errorlevel%
,因为在开始执行之前,读取的变量已替换为变量的值,您将看不到实际值

您可以使用延迟扩展(在批处理文件的开头包括
setlocal enabledelayedexpansion
),并将语法从
%errorlevel%
更改为
!错误等级
向解析器指示变量读取应该延迟到执行命令的那一刻

或者您可以使用
if errorlevel n…
语法。在这种情况下,您应该记住,对于任何大于或等于指示值的
errorlevel
值,该条件都为真

也就是说,如果
errorlevel
为1,则
如果errorlevel 1
如果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
                )
            )
        )
    )
)

“ECHO%%J”是甲骨文的主页。在本例中,它返回4个不同的ORACLE_HOME。该信息对我们没有帮助,因为我们不知道在解析命令
reg query
by
tokens=1,2,3*
的输出时,变量h、i和j得到了什么
ECHO关闭。
在输出中表示变量j是一个空字符串,因此执行时,
ECHO%%j
只是
ECHO
,这导致将ECHO的状态打印到控制台窗口中。在req查询中应返回的字符串是:d:\oracle\806 d:\oracle\isuites d:\oracle\ora90d:\oracle\forms10g变量%%G是一个返回HOME0、HOME1、HOME2和HOME3的计数器,因此,您应该有,例如:HOME0 d:\oracle\806重点是,对于每个HOME…0、1、2、3…测试,其中HOME实际上有…806、iSuite、forms10g或ora90希望它对您有所帮助,谢谢您的输入。%%j已返回文件夹,这实际上是预期的结果。关于errorlevel,我改为您的建议,输出是相同的…如果我将%errorlevel%改为,则每个ORACLE_Homes只返回一个YES和三个No,我总是得到YES!错误等级!随着深度扩张,它只是说,这在这个时候是出乎意料的,不会run@PedroSales,我已包含您的代码的修改副本。如果可以的话,新代码的唯一问题是没有输出HOME0…再次感谢您的更新。HOME0仍然没有被测试,这应该是因为它存在,d:\oracle\806,并且没有返回错误