【问题标题】:batch file with echo findstr not working inside for loop带有 echo findstr 的批处理文件在 for 循环中不起作用
【发布时间】:2014-07-07 08:09:53
【问题描述】:

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

【问题讨论】:

  • “ECHO %%J”是 ORACLE_HOME。在这种情况下,它返回 4 个不同的 ORACLE_HOME。
  • 这些信息对我们没有帮助,因为我们不知道变量 hij是什么> 继续通过tokens=1,2,3* 解析命令reg query 的输出。输出中的ECHO is off. 表明变量 j 是一个空字符串,因此echo %%j 在执行时只是echo,这会导致在控制台窗口中打印回显状态。
  • 应该在 req 查询中返回的字符串是: d:\oracle\806 d:\oracle\isuites d:\oracle\ora90 d:\oracle\forms10g 变量 %%G 是返回 HOME0、HOME1、HOME2 和 HOME3 的计数器 所以,你应该有,例如: HOME0 d:\oracle\806 关键是,对于每个 HOME ...0、1、2、3 ...测试 wich home实际上有 ...806、isuites、forms10g 或 ora90 希望对您有所帮助

标签: batch-file for-loop echo findstr


【解决方案1】:

您的代码需要进行一些更正

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 为1,则if errorlevel 1if 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
            )

        )
    )
)

编辑以适应 cmets

如果注册表中不存在某些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
                )
            )
        )
    )
)

【讨论】:

  • 您好,感谢您的意见。 %%j 已经返回文件夹,这实际上是预期的。关于错误级别,我改变了你的建议,结果是一样的......当它应该为每个 ORACLE_HOMEs 只返回一个 YES 和 3 个 NO 时,我总是得到 YESs
  • 如果我将 %ERRORLEVEL% 更改为 !errorlevel!使用 deplyedexpansion 它只是说此时这是意外的并且不会运行
  • @PedroSales,我已经包含了您的代码的修改副本。
  • 如果可以的话,新代码的唯一问题是没有输出 HOME0 ....
  • 再次感谢您的更新。 HOME0还没测试,应该是因为存在,d:\oracle\806,没有返回错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多