windowsfor-loopbatch-filedelimiter

Windows batch file - splitting a string to set variables


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?


Solution

  • 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 MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
    
    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%
    

    EDIT 2023/01/20: New method added

    I know this is a very old question. However, I can't resist the temptation to post a new very interesting method to solve this old problem:

    @echo off 
    
    set MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
    
    set "%MYSTRING:,=" & set "%"
    
    echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%
    

    If you want to know where the magic is, remove the @echo off line, execute the program and carefully review the screen...