1.

Solve : Dynamic environment variable substring offset & length?

Answer»

I wrote the FOLLOWING, and am having trouble at the indicated location:

Code: [Select]REM SPLIT.BAT
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET STRING=%1
SET STRING=%STRING:~1,-1%
ECHO %STRING%>x & FOR %%A IN (x) DO SET /A STRLENGTH=%%~zA - 2 & DEL x
SET SEMINUM=0
FOR /L %%I IN (0,1,%STRLENGTH%) DO IF "!STRING:~%%I,1!" EQU ";" (
SET /A SEMINUM=!SEMINUM!+1
SET K.!SEMINUM!=%%I
)
SET /A %2.0=%SEMINUM%+1
SET /A I=%SEMINUM%+1
SET /A K.%I%=%STRLENGTH%
SET L=0
FOR /L %%I IN (1,1,%I%) DO IF "1" EQU "1" (
SET J=!K.%%I!
REM ---------------------------------------------------------
REM None of these is correct
REM
SET %2.%%I=!STRING:~!L!,!J!!
SET %2A.%%I=%STRING:~!L!,!J!%
SET %2B.%%I=%%STRING:~!L!,!J!%%
REM ---------------------------------------------------------
SET /A L=!J!+1
)
@ECHO ON
SET %2.
SET %2A.
SET %2B.

Here are the results I get:

>SPLIT.BAT "ONE;TWO;THREE;FOUR;FIVE;SIX" VAR

>SET VAR.
VAR.0=6
VAR.1=ONE;TWO;THREE;FOUR;FIVE;SIXLJ
VAR.2=ONE;TWO;THREE;FOUR;FIVE;SIXLJ
VAR.3=ONE;TWO;THREE;FOUR;FIVE;SIXLJ
VAR.4=ONE;TWO;THREE;FOUR;FIVE;SIXLJ
VAR.5=ONE;TWO;THREE;FOUR;FIVE;SIXLJ
VAR.6=ONE;TWO;THREE;FOUR;FIVE;SIXLJ

>SET VARA.
VARA.1=STRING:~0,3
VARA.2=STRING:~4,7
VARA.3=STRING:~8,13
VARA.4=STRING:~14,18
VARA.5=STRING:~19,23
VARA.6=STRING:~24,28

>SET VARB.
VARB.1=%STRING:~0,3%
VARB.2=%STRING:~4,7%
VARB.3=%STRING:~8,13%
VARB.4=%STRING:~14,18%
VARB.5=%STRING:~19,23%
VARB.6=%STRING:~24,28%

Is this possible? Thanks in ADVANCE for any help you might provide.I can see why the error is there.
You cannot USE two delayed variables as you have shown, to separate a string using another delayed variable.

If you supply an input string and DESCRIBE what you need to do then there may be better ways to do it.I am not sure what you are trying to do or why your input to your batch file would be like.
This gives some better output but it still don't look right.
Code: [Select]REM SPLIT.BAT
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET STRING=%1
SET STRING=%STRING:~1,-1%
ECHO %STRING%>x & FOR %%A IN (x) DO SET /A STRLENGTH=%%~zA - 2 & DEL x
SET SEMINUM=0
FOR /L %%I IN (0,1,%STRLENGTH%) DO IF "!STRING:~%%I,1!" EQU ";" (
SET /A SEMINUM=!SEMINUM!+1
SET K.!SEMINUM!=%%I
)
SET /A %2.0=%SEMINUM%+1
SET /A I=%SEMINUM%+1
SET /A K.%I%=%STRLENGTH%
SET L=0
FOR /L %%I IN (1,1,%I%) DO IF "1" EQU "1" (
SET J=!K.%%I!
REM ---------------------------------------------------------
REM None of these is correct
REM
CALL SET %2.%%I=%%STRING:~!L!,!J!%%
CALL SET %2A.%%I=%%STRING:~!L!,!J!%%
CALL SET %2B.%%I=%%STRING:~!L!,!J!%%
REM ---------------------------------------------------------
SET /A L=!J!+1
)
@ECHO ON
SET %2.
SET %2A.
SET %2B.Output
Code: [Select]C:\Users\Squashman\Batch\split>SPLIT.BAT "ONE;TWO;THREE;FOUR;FIVE;SIX" VAR

C:\Users\Squashman\Batch\split>REM SPLIT.BAT

C:\Users\Squashman\Batch\split>SET VAR.
VAR.0=6
VAR.1=ONE
VAR.2=TWO;THR
VAR.3=THREE;FOUR;FI
VAR.4=FOUR;FIVE;SIX
VAR.5=FIVE;SIX
VAR.6=SIX

C:\Users\Squashman\Batch\split>SET VARA.
VARA.1=ONE
VARA.2=TWO;THR
VARA.3=THREE;FOUR;FI
VARA.4=FOUR;FIVE;SIX
VARA.5=FIVE;SIX
VARA.6=SIX

C:\Users\Squashman\Batch\split>SET VARB.
VARB.1=ONE
VARB.2=TWO;THR
VARB.3=THREE;FOUR;FI
VARB.4=FOUR;FIVE;SIX
VARB.5=FIVE;SIX
VARB.6=SIX

C:\Users\Squashman\Batch\split>Thanks, I needed that.



Discussion

No Comment Found