Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dos batch iterate through a delimited string

I have a delimited list of IPs I'd like to process individually. The list length is unknown ahead of time. How do I split and process each item in the list?

@echo off set servers=127.0.0.1,192.168.0.1,10.100.0.1  FOR /f "tokens=* delims=," %%a IN ("%servers%") DO call :sub %%a  :sub     echo In subroutine     echo %1 exit /b 

Outputs:

In subroutine 127.0.0.1 In subroutine ECHO is off. 

Update: Using Franci's answer as reference, here's the solution:

@echo off set servers=127.0.0.1,192.168.0.1,10.100.0.1  call :parse "%servers%" goto :end   :parse setlocal set list=%1 set list=%list:"=% FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (   if not "%%a" == "" call :sub %%a   if not "%%b" == "" call :parse "%%b" ) endlocal exit /b  :sub setlocal echo In subroutine echo %1 endlocal exit /b  :end 

Outputs:

In subroutine 127.0.0.1 In subroutine 192.168.0.1 In subroutine 10.100.0.1 
like image 424
bjaxbjax Avatar asked Mar 26 '10 16:03

bjaxbjax


1 Answers

The for command handles a number of delimiters by default. In this case you can do

@echo off  set servers=127.0.0.1,192.168.0.1,10.100.0.1  for %%i in (%servers%) do (   echo %%i ) 

If you run into a delimiter that is not natively supported, you could do a replace to first prepare the string so it is in the right format

@echo off  set [email protected]@10.100.0.1 set servers=%servers:@=,%  for %%i in (%servers%) do (   echo %%i ) 

Using recursive calls has the chance to run out of stack space once you go over a certain number of items in the list. Also testing it, the recursion pattern seems to run a bit slower.

like image 74
Matthew Benedict Avatar answered Sep 23 '22 00:09

Matthew Benedict