Windows batch file - splitting a string to set variables

28,770

Solution 1

The default delimiters for elements in plain FOR command (no /F option) are spaces, tab, commas, semicolons and equal signs, and there is no way to modify that, so you may use FOR /F command to solve this problem this way:

@echo off 

set MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234

:nextVar
   for /F "tokens=1* delims=," %%a in ("%MYSTRING%") do (
      set %%a
      set MYSTRING=%%b
   )
if defined MYSTRING goto nextVar
echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%

Another way to solve this problem is first taking the variable name and then executing the assignment for each pair of values in a regular FOR command:

setlocal EnableDelayedExpansion

set varName=
for %%a in (%MYSTRING%) do (
   if not defined varName (
      set varName=%%a
   ) else (
      set !varName!=%%a
      set varName=
   )
)
echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%

Solution 2

In case your input is something like HOSTNAME:PORT and you need to split into separate variables then you can use this

@echo off
set SERVER_HOST_PORT=10.0.2.15:8080


set SERVER_HOST_PORT=%SERVER_HOST_PORT::=,%

for /F "tokens=1* delims=," %%a in ("%SERVER_HOST_PORT%") do (
   set SERVER_HOST=%%a
   set SERVER_PORT=%%b
)

echo SERVER_HOST=%SERVER_HOST%
echo SERVER_PORT=%SERVER_PORT%
Share:
28,770
AndyC
Author by

AndyC

Updated on November 11, 2020

Comments

  • AndyC
    AndyC over 3 years

    I feel like I'm going around in circles with FOR loop options.

    I'm trying to take a string (output of a command) and split it on commas, then use each value to SET, e.g.

    String: USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234

    So I want to split on comma and then literally use that variable in SET. I don't know ahead of time how many many variables there will be.

    I've tried things like:

    FOR %%L IN (%MYSTRING%) DO ECHO %%L
    

    but that splits on the equals sign too so I end up with

    USER
    Andy
    IP
    1.2.3.4
    

    etc

    I just want to be able to do the following so I can SET USER=Andy etc, something like:

    FOR %%L IN (%MYSTRING%) DO SET %%L
    

    What option or flags am I missing?