1

I am trying a simple operation in a batch file. Iterate through tokens and perform some task for each token.

Can someone point out why following script results in a recursive loop and iterating through the first token all the time ?

@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
4

2 回答 2

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
于 2013-09-07T13:26:31.437 回答
0

如果我了解您要做什么,您的问题就在这一行(这可能是过度设计的)

 set servers = %%b

像这样删除空格,因为您正在使用空格创建变量“%servers %”。

 set servers=%%b
于 2013-09-07T22:09:34.960 回答