Windows批处理中FOR循环内的goto。

5

我有一个Windows批处理文件,用于读取文件并获取一些信息,例如机器IP,然后打印该机器的一些注册表值,类似于以下内容:

for /f "skip=1 tokens=1,2,3,4,5,6,* delims=;" %%a in ('findstr /R "^" z:\csp\levantamento\levantamentoNOVO.csv') do (

set /A "HOME=0"

:cicle
echo HOME%HOME%
echo \\%%c\HKLM\SOFTWARE\ORACLE\HOME%HOME%

reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%HOME% /v ORACLE_HOME

if %HOME% leq 3 (
    set /A "HOME+=1"
    goto cicle
) else (
    echo.
)

echo Conenction to %%a deleted
)

以下是我的输出结果:

HOME0
\\10.13.3.27\HKLM\SOFTWARE\ORACLE\HOME0
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 ORACLE_HOME REG_EXPAND_SZ d:\oracle\806
HOME1 \\%c\HKLM\SOFTWARE\ORACLE\HOME1 错误:找不到网络路径。 HOME2 \\%c\HKLM\SOFTWARE\ORACLE\HOME2 错误:找不到网络路径。 HOME3 \\%c\HKLM\SOFTWARE\ORACLE\HOME3 错误:找不到网络路径。 HOME4 \\%c\HKLM\SOFTWARE\ORACLE\HOME4 错误:找不到网络路径。
与 %a 的连接已删除

当我执行 goto cicle 时,似乎 FOR 循环不再知道 %%c 和 %%c 是什么。我真的不知道我做错了什么。


如果在for循环内使用goto命令,则for循环将被取消,不再进行迭代,并且for可替换的参数/变量超出范围。 - MC ND
好的...不知道那个... - Pedro Sales
那么,有没有办法做我正在尝试的事情? - Pedro Sales
for /l %%x in (0 1 3) do .... 命令替换你的内部循环。 - MC ND
谢谢!非常感谢!!! - Pedro Sales
这个回答解决了你的问题吗?批处理文件:在FOR循环中使用GOTO - Limer
1个回答

5

尝试

for /f "skip=1 tokens=1,2,3,4,5,6,* delims=;" %%a in ('findstr /R "^" z:\csp\levantamento\levantamentoNOVO.csv') do (

 set /A HOME=0
 call :cicle "%%a" "%%c"
)

:: what-to-do-after-for goes in here

goto :eof

:cicle
echo HOME%HOME%
echo \\%~2\HKLM\SOFTWARE\ORACLE\HOME%HOME%

reg query \\%~2\HKLM\SOFTWARE\ORACLE\HOME%HOME% /v ORACLE_HOME

if %HOME% leq 3 (
    set /A HOME+=1
    goto cicle
)
echo.

echo Connection to %~1 deleted
goto :eof

请注意,现在有一个名为 cicle 的子例程,其中提供了参数“%%a”和“%%c”。 在 cicle 例程中,%%a 变成了%~1(第一个参数,减去引号),%%c 变成了%~2(第二个参数,减去引号)。
引号仅在传递的参数包含分隔符字符时才存在,这在您当前的情况下是不太可能的。
从提示中查看call /?以获取文档。
还要注意,在字符串赋值中使用set“var = variable”以确保不包括不需要的尾随空格。set / a 语法不会遇到此问题,因此兔耳朵不是必需的。

MC ND 的回答很到位!最好的方法是使用 for /l 循环。 - Pedro Sales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接