Batch file echo findstr在for循环内部不工作的批处理文件
我有多个字符串来自for循环中的reg查询。 我想验证他们中的每一个人是否有特定的词语,如果有,就采取行动。 我的代码是: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 /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
bytokens=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,并且没有返回错误