我在批处理文件中尝试一个简单的操作。迭代令牌并为每个令牌执行一些任务。
有人可以指出为什么跟踪脚本会导致递归循环并一直迭代第一个令牌吗?
@echo off
set servers=10.20.30.40,200.300.400.500
echo %servers%
Call :configureDataStore "%servers%"
goto :eos
:configureDataStore
set list=%servers%
set list=%list:"=%
FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (
if not "%%a" == "" call :configureSlave %%a
if not "%%b" == "" (
set servers = %%b
call :configureDataStore "%%b"
)
)
goto :eos
:configureSlave
echo In subroutine %1
goto :eos
:eos
答案 0 :(得分:4)
你有一个非常简单的逻辑错误。您使用一个参数调用:configureDataStore
,但在您应该使用%servers%
(参数)时,在例程中引用%1
(常量)
实际上,如果要删除封闭的引号,则应使用%~1
。
您应该使用goto :eos
而不是goto :eof
。每个脚本末尾都有一个隐式:eof
标签,因此您不必将:eof
放在文件的末尾。
我更喜欢的更现代的版本是exit /b
,它与goto :eof
完全相同。 exit /b
的优点是可以根据需要设置ERRORLEVEL:exit /b 1
。
您可以使用%0
来获取当前正在执行的子例程的名称,而不是使用像“子例程”这样的通用字。您可以使用%*
获取所有传递的参数(在这种情况下与%1
无差异)
正如目前所写,您正在使用比所需更多的变量。但这显然是未完成的代码,我不知道你要去哪里。所以我保持变量用法不变。
@echo off
set servers=10.20.30.40,200.300.400.500
echo %servers%
Call :configureDataStore "%servers%"
exit /b
:configureDataStore
set "list=%~1"
FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (
if not "%%a" == "" call :configureSlave %%a
if not "%%b" == "" (
set servers = %%b
call :configureDataStore "%%b"
)
)
exit /b
:configureSlave
echo In %0 %*
exit /b
答案 1 :(得分:0)
如果我明白你要做的事情(这是一个过度设计的过度设计),你的问题就在这一行。
set servers = %%b
删除这样的空格,因为您正在使用空格创建变量“%servers%”。
set servers=%%b